以编程方式将LaTeX代码转换/解析为纯文本

and*_*ley 7 python parsing text latex

我有几个C++/Python的代码项目,其中使用LaTeX格式的描述和标签来生成使用LaTeX + pstricks制作的PDF文档或图形.但是,我们还有一些纯文本输出,例如文档的HTML版本(我已经有代码为其编写最小标记)和非TeX启用的绘图渲染器.

对于这些,我想消除例如代表物理单位所必需的TeX标记.这包括非破坏(稀疏)空格,\ text,\ mathrm等.对于纯文本输出,将\ frac {#1} {#2}之类的内容解析为#1 /#2也是很好的(和将MathJax用于HTML).由于我们目前已经拥有的系统,我需要能够从Python执行此操作,即理想情况下我正在寻找Python包,但我可以从Python调用非Python可执行文件并捕获输出字符串也没问题.

我知道在TeX StackExchange网站上类似的问题,但是没有任何真正的程序化解决方案:我看过detex,plasTeX和pytex,他们看起来都有点死了,并没有真正做到我需要的是:将TeX字符串编程转换为代表性的纯文本字符串.

我可以尝试使用例如pyparsing来编写一个基本的TeX解析器,但是a)可能会陷入困境并得到帮助,并且b)肯定有人之前尝试过,或者知道一种方法来连接到TeX本身以获得更好的结果?

更新:感谢所有的答案......它确实看起来确实是一个尴尬的请求!我可以用少于一般的LaTeX解析来做,但是在循环中考虑解析器而不是加载正则表达式的原因是我希望能够很好地处理嵌套宏和多arg宏,并得到大括号匹配工作正常.然后我可以首先减少txt无关的宏,比如\ text和\ mathrm,并处理txt相关的宏,比如\ frac last ...甚至可以用合适的括号!好吧,我可以梦想...现在正则表达并没有做那么糟糕的工作.

Lit*_*les 5

提醒您一点:为纯TeX编写完整的解析器要比您想像的要困难得多。TeX级(不是LaTeX)\def命令实际上扩展了TeX的语法。例如,\def\foo #1.{{\bf #1}}将扩展\foo goo.goo-注意,该点成为foo宏的定界符!因此,如果您必须处理任何形式的TeX,而没有限制可以使用哪些程序包,则不建议依赖简单的解析。您需要TeX渲染。 catdvi是我使用的,尽管并不完美。


Alv*_*Wan 5

我知道这是一篇过时的文章,但是由于该文章经常出现在乳胶python分析搜索中(如仅从arXiv文章中提取为.tex的正文文本中提取内容很明显),因此请大家留在这里: Python中的LaTeX解析器,支持搜索和修改解析树https://github.com/alvinwan/texsoup。摘自自述文件,这里是示例文本以及如何通过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}
""")
Run Code Online (Sandbox Code Playgroud)

这是导航解析树的方法。

>>> 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]
Run Code Online (Sandbox Code Playgroud)

免责声明:我写了这个lib,但这是出于类似的原因。关于Little Bobby Tales的帖子(关于def),TexSoup不处理定义。


abe*_*sto 2

尝试detex(随大多数 *TeX 发行版一起提供)或改进版本: http: //code.google.com/p/opendetex/

编辑:哦,我看到你已经尝试过 detex 了。尽管如此,opendetex 可能对你有用。