Создание PNG|jpeg из LaTeX в C или C++

Я ищу библиотеку (или более умное решение) на C или C++, которая сделает файл изображения (PNG|jpeg) из кода LaTeX. Использование пакетов является обязательным условием.

Сейчас я думаю о том, чтобы скомпилировать файл .tex в .dvi и использовать dvipng для получения .PNG.

Существует также возможность скомпилировать файл .tex в файл .ps, а затем преобразовать его в .PNG с помощью внешних утилит, таких как pstopng или pstoedit.

Но эти решения громоздки и не всегда переносимы. Я хотел бы прозрачно интегрировать это преобразование в свою программу.


person anno    schedule 16.12.2009    source источник
comment
Очень похоже на ‹stackoverflow.com/questions/617668/›.   -  person unwind    schedule 16.12.2009
comment
Он чем-то похож, но не является точной копией.   -  person Peter    schedule 16.12.2009


Ответы (2)


Я уже несколько раз использовал маршрут 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
comment
Спасибо за ответ. Предоставленные параметры командной строки dvipng особенно полезны. - person anno; 16.12.2009

Если вы хотите преобразовать часть своего кода в файлы png, а не обязательно весь код, загляните в предварительный просмотр. Согласно их 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
person Alok Singhal    schedule 16.12.2009