Программно конвертировать / анализировать код LaTeX в обычный текст - PullRequest
6 голосов
/ 25 января 2011

У меня есть пара проектов кода на C ++ / Python, в которых описания и метки в формате LaTeX используются для генерации PDF-документации или графиков, созданных с использованием LaTeX + pstricks. Тем не менее, у нас также есть несколько простых текстовых выводов, таких как HTML-версия документации (у меня уже есть код для написания минимальной разметки для этого) и средство визуализации без поддержки TeX.

Для этого я хотел бы удалить разметку TeX, которая необходима, например, для представляющие физические единицы. Это включает неразрывные (тонкие) пробелы, \ text, \ mathrm и т. Д. Было бы также хорошо разобрать такие вещи, как \ frac {# 1} {# 2} в # 1 / # 2 для вывода простого текста (и используйте MathJax для HTML). Из-за системы, которая у нас есть на данный момент, я должен быть в состоянии сделать это из Python, то есть в идеале Я ищу пакет Python, но не исполняемый Python, который я могу вызов из Python и перехват выходной строки тоже подойдет.

Я знаю о подобном вопросе на сайте TeX StackExchange , но не было никаких действительно программных решений для этого: я смотрел на detex, plasTeX и pytex, которые кажутся им всем немного мертвый и на самом деле не делает то, что мне нужно: программное преобразование строки TeX в типичную текстовую строку.

Я мог бы попытаться написать базовый парсер TeX, используя, например, pyparsing, но а) это может быть связано с ловушками и помочь, и б) наверняка кто-то пробовал это раньше или знает, как подключиться к самому TeX, чтобы получить лучший результат?

Обновление: Спасибо за все ответы ... это действительно кажется немного неловким запросом! Я могу обойтись менее чем обычным синтаксическим анализом LaTeX, но причина рассмотрения парсера, а не загрузки регулярных выражений в цикле, заключается в том, что я хочу иметь возможность красиво обрабатывать вложенные макросы и макросы с несколькими аргументами и получить скобки соответствие для правильной работы. Тогда я могу, например, уменьшите txt-нерелевантные макросы, такие как \ text и \ mathrm first, и обработайте txt-релевантные макросы, такие как \ frac last ... возможно, даже с соответствующими скобками! Ну, я могу мечтать ... пока регулярные выражения не делают такую ​​ужасную работу.

Ответы [ 7 ]

4 голосов
/ 25 января 2011

Предостережение: написать полный анализатор для простого TeX гораздо сложнее, чем вы думаете.Команда \def уровня TeX (не LaTeX) фактически расширяет синтаксис TeX.Например, \def\foo #1.{{\bf #1}} расширит \foo goo. до goo - Обратите внимание, что точка стала разделителем для макроса foo!Поэтому, если вам приходится иметь дело с любой формой TeX , без ограничений на использование пакетов, не рекомендуется полагаться на простой анализ.Вам нужен рендеринг TeX. catdvi - это то, что я использую, хотя оно и не идеально.

4 голосов
/ 03 мая 2018

Я понимаю, что это старый пост, но поскольку этот пост часто встречается при поиске с разбивкой по латекс-питону (как видно из Извлечение только основного текста из статей arXiv, отформатированных как .tex ), оставляя это здесь для людей внизу: Вот синтаксический анализатор LaTeX в Python, который поддерживает поиск и модификацию дерева разбора, https://github.com/alvinwan/texsoup. Взятый из README, вот пример текста и как вы можете взаимодействовать с ним через TexSoup.

from TexSoup import TexSoup
soup = TexSoup("""
\begin{document}

\section{Hello \textit{world}.}

\subsection{Watermelon}

(n.) A sacred fruit. Also known as:

\begin{itemize}
\item red lemon
\item life
\end{itemize}

Here is the prevalence of each synonym.

\begin{tabular}{c c}
red lemon & uncommon \\
life & common
\end{tabular}

\end{document}
""")

Вот как можно перемещаться по дереву разбора.

>>> soup.section  # grabs the first `section`
\section{Hello \textit{world}.}
>>> soup.section.name
'section'
>>> soup.section.string
'Hello \\textit{world}.'
>>> soup.section.parent.name
'document'
>>> soup.tabular
\begin{tabular}{c c}
red lemon & uncommon \\
life & common
\end{tabular}
>>> soup.tabular.args[0]
'c c'
>>> soup.item
\item red lemon
>>> list(soup.find_all('item'))
[\item red lemon, \item life]

Отказ от ответственности: я написал эту библиотеку, но это было по тем же причинам. Что касается поста Little Bobby Tales (относительно def), TexSoup не обрабатывает определения.

1 голос
/ 25 января 2011

Я бы попробовал pandoc [введите описание ссылки здесь] [1]. Он написан на Haskell, но это действительно хороший конвертер из latex 2.

[1]: http://johnmacfarlane.net/pandoc/index.html.

1 голос
/ 25 января 2011

Поскольку вы рассматриваете возможность использования самого TeX для рендеринга, я подозреваю, что производительность не является проблемой.В этом случае у вас есть несколько вариантов: dvi2txt для извлечения вашего текста из одного файла dvi (будьте готовы сгенерировать один для каждой метки) или даже рендеринг dvi в растровые изображения, если это вам подходит - вот как гевея илиlatex2html обрабатывает формулы.

1 голос
/ 25 января 2011

Попробуйте detex (поставляется с большинством * дистрибутивов TeX) или улучшенную версию: http://code.google.com/p/opendetex/

Редактировать: о, я вижу, вы уже пробовали Detex. Тем не менее, opendetex может работать для вас.

0 голосов
/ 01 февраля 2011

Построение другого поста. Эдуардо Леони. Я смотрел на pandoc и вижу, что он поставляется с отдельным исполняемым файлом, но также на этой странице он обещает способ сборки в C-вызываемую системную библиотеку. Возможно, это то, с чем вы можете жить?

0 голосов
/ 25 января 2011

Описания и метки в формате LaTeX используются для создания PDF-документации или графиков с использованием LaTeX + pstricks

Это твоя ошибка. Тебе не следовало этого делать.

Используйте RST или другой, более лучший, язык разметки.

Используйте Docutils для создания LaTeX и HTML из источника RST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...