我正在尋找一個C或C++庫(或更聰明的解決方案),它將從LaTeX代碼生成一個圖像文件(PNG | jpeg)。使用包是一個先決條件。從C或C++的LaTeX製作PNG | jpeg
現在我正在考慮將.tex文件編譯爲.dvi文件,並使用dvipng來獲取.PNG文件。
還有編譯.tex文件轉換成.ps文件,然後像pstopng或pstoedit將其轉換成.PNG通過的extern公用事業平均的可能性。
但是,這些解決方案很麻煩,並不總是便攜式的。我想透明地將此轉換集成到我的程序中。
我正在尋找一個C或C++庫(或更聰明的解決方案),它將從LaTeX代碼生成一個圖像文件(PNG | jpeg)。使用包是一個先決條件。從C或C++的LaTeX製作PNG | jpeg
現在我正在考慮將.tex文件編譯爲.dvi文件,並使用dvipng來獲取.PNG文件。
還有編譯.tex文件轉換成.ps文件,然後像pstopng或pstoedit將其轉換成.PNG通過的extern公用事業平均的可能性。
但是,這些解決方案很麻煩,並不總是便攜式的。我想透明地將此轉換集成到我的程序中。
我已經使用過幾次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提供的命令行選項特別有用。 – anno 2009-12-16 08:52:46
如果你想你的部分代碼轉換成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
非常相似。 –
unwind
2009-12-16 08:19:50
它有點類似,但它很少成爲「完全重複」。 – Peter 2009-12-16 08:31:45