Я уже несколько раз использовал маршрут dvipng, но в python. Это общий путь, по которому прошли многие люди. Вот код, чтобы дать вам что-то для начала, и на случай, если кому-то понадобится код Python. Я понимаю, что вы просили C/C++; это для начала или для других. Это для создания уравнений, но было бы тривиально адаптировать его для более общих структур. Он поддерживает пакеты.
Что касается прозрачной интеграции, я чувствую вашу боль. Конечно, не у всех есть текс/латекс, а если и нет, то достать его часто бывает непросто. Я думаю, что лучший способ сделать это — предоставить эту функциональность в виде веб-службы, но, конечно, это не всегда вариант.
Наконец, обратите внимание на все параметры 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)
person
Peter
schedule
16.12.2009