【问题标题】:Making PNG|jpeg from LaTeX in C or C++ [closed]在 C 或 C++ 中从 LaTeX 制作 PNG|jpeg [关闭]
【发布时间】:2010-12-27 03:36:28
【问题描述】:

我正在寻找可以从 LaTeX 代码生成图像文件 (PNG|jpeg) 的 C 或 C++ 库(或更聪明的解决方案)。使用包是先决条件。

现在我正在考虑将 .tex 文件编译成 .dvi 并使用 dvipng 来获取 .PNG。

还可以将 .tex 文件编译为 .ps 文件,然后通过 pstopngpstoedit 等外部实用程序将其转换为 .PNG .

但这些解决方案很麻烦,而且并不总是可移植的。我想将此转换透明地集成到我的程序中。

【问题讨论】:

  • 非常类似于 stackoverflow.com/questions/617668/…>。
  • 它有点相似,但与“完全重复”相去甚远。

标签: c++ c latex png jpeg


【解决方案1】:

我之前多次使用过 dvipng 路由,但在 python 中。这是一条普通的路,很多人都走过。这是代码,可以帮助您入门,以防万一有人想要 Python 代码。 我确实意识到您要求使用 C/C++;这是为初学者或其他人准备的。 这是用于生成方程,但将其用于更一般的结构将是微不足道的。它确实支持包。

在透明集成方面,我感受到了你的痛苦。当然,不是每个人都有 tex / latex,如果他们没有,通常会很痛苦。我认为最好的方法是将该功能作为 Web 服务提供 - 但当然这并不总是一种选择。

最后,请注意 dvipng 的所有选项。它们通过各种抗锯齿选项等来控制外观。我对它们进行了广泛的调整,以获得我认为看起来不错的效果。

def geneq(f, eq, dpi, wl, outname, packages):
    # First check if there is an existing file.
    eqname = os.path.join(f.eqdir, outname + '.png')

    # Open tex file.
    tempdir = tempfile.gettempdir()
    fd, texfile = tempfile.mkstemp('.tex', '', tempdir, True)
    basefile = texfile[:-4]
    g = os.fdopen(fd, 'w')

    preamble = '\documentclass{article}\n'
    for p in packages:
        preamble += '\usepackage{%s}\n' % p

    preamble += '\pagestyle{empty}\n\\begin{document}\n'
    g.write(preamble)

    # Write the equation itself.
    if wl:
        g.write('\\[%s\\]' % eq)
    else:
        g.write('$%s$' % eq)

    # Finish off the tex file.
    g.write('\n\\newpage\n\end{document}')
    g.close()

    exts = ['.tex', '.aux', '.dvi', '.log']
    try:
        # Generate the DVI file
        latexcmd = 'latex -file-line-error-style -interaction=nonstopmode ' + \
               '-output-directory %s %s' % (tempdir, texfile)
        p = Popen(latexcmd, shell=True, stdout=PIPE)
        rc = p.wait()
        if rc != 0:
            for l in p.stdout.readlines():
                print '  ' + l.rstrip()
            exts.remove('.tex')
            raise Exception('latex error')

        dvifile = basefile + '.dvi'
        dvicmd = 'dvipng --freetype0 -Q 9 -z 3 --depth -q -T tight -D %i -bg Transparent -o %s %s' % (dpi, eqname, dvifile)
        # discard warnings, as well.
        p = Popen(dvicmd, shell=True, stdout=PIPE, stderr=PIPE)
        rc = p.wait()
        if rc != 0:
            print p.stderr.readlines()
            raise Exception('dvipng error')
        depth = int(p.stdout.readlines()[-1].split('=')[-1])
    finally:
        # Clean up.
        for ext in exts:
            g = basefile + ext
            if os.path.exists(g):
                os.remove(g)

【讨论】:

  • 感谢您的回答。 dvipng 提供的命令行选项特别有用。
【解决方案2】:

如果您想将部分代码转换为 png 文件,而不是全部,请查看preview package。根据他们的README,它可以提取 Latex 源文件的一部分以分离 dvi 文件,并且可以将这些文件转换为 png 文件。替代使用 dvipng 获取 PNG 的另一种选择是将生成的 PDF/ps 文件直接转换为 PNG:

gs -sDEVICE=png16m -dTextAlphaBits=4 -r300 -dGraphicsAlphaBits=4 -dSAFER -dBATCH -dNOPAUSE -sOutputFile=file.png file.pdf

【讨论】:

    猜你喜欢
    • 2010-12-04
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 2012-07-06
    • 2015-02-14
    • 1970-01-01
    • 2018-08-27
    • 2012-01-12
    相关资源
    最近更新 更多