2009-12-16 144 views
4

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

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

还有编译.tex文件转换成.ps文件,然后像pstopngpstoedit将其转换成.PNG通过的extern公用事业平均的可能性。

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

+0

非常相似。 – unwind 2009-12-16 08:19:50

+2

它有点类似,但它很少成为“完全重复”。 – Peter 2009-12-16 08:31:45

回答

2

我已经使用过几次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) 
+0

感谢您的回答。 dvipng提供的命令行选项特别有用。 – anno 2009-12-16 08:52:46

1

如果你想你的部分代码转换成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