我有几个 C++/Python 代码项目,其中使用 LaTeX 格式的描述和标签来生成使用 LaTeX+pstricks 制作的 PDF 文档或图表。然而,我们也有一些纯文本输出,例如 HTML 版本的文档(我已经有代码来为此编写最小标记)和不支持 TeX 的绘图渲染器。
对于这些,我想消除例如所需的 TeX 标记。代表物理单位。这包括不间断(薄)空格、\text、\mathrm 等。将 \frac{#1}{#2} 之类的内容解析为 #1/#2 以获得纯文本输出(以及使用 MathJax 作为 HTML)。由于我们目前拥有的系统,我需要能够通过 Python 执行此操作,即ideally我正在寻找一个 Python 包,但我可以从 Python 调用并捕获输出字符串的非 Python 可执行文件也可以。
我知道TeX StackExchange 网站上有类似的问题 https://tex.stackexchange.com/questions/6431/options-for-converting-latex-to-plain-text,但没有任何真正的编程解决方案:我研究过 detex、plasTeX 和 pytex,它们看起来都有点死了,并没有真正做我需要的事情:TeX 字符串到代表的编程转换纯文本字符串。
我可以尝试使用例如编写一个基本的 TeX 解析器pyparsing,但是a)这可能充满陷阱,我们将不胜感激,b)肯定有人以前尝试过,或者知道一种方法来连接TeX本身以获得更好的结果?
Update:感谢您的所有回答...这确实似乎是一个有点尴尬的要求!我可以用较少的 LaTeX 解析来凑合,但考虑解析器而不是循环中的正则表达式负载的原因是我希望能够很好地处理嵌套宏和多参数宏,并获得大括号匹配才能正常工作。然后我可以例如首先减少与 txt 不相关的宏,例如 \text 和 \mathrm,然后处理与 txt 相关的宏,例如 \frac 最后...甚至可能使用适当的括号!好吧,我可以梦想......目前正则表达式并没有做那么糟糕的工作。
我知道这是一篇旧文章,但由于这篇文章经常出现在 Latex-python-parsing 搜索中(如仅从 .tex 格式的 arXiv 文章中提取正文文本 https://stackoverflow.com/questions/49779853/extract-only-body-text-from-arxiv-articles-formatted-as-tex),把这个留给下面的人:这是一个 Python 中的 LaTeX 解析器,支持对解析树的搜索和修改,https://github.com/alvinwan/texsoup 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}
""")
以下是如何导航解析树。
>>> 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]
免责声明:我写了这个库,但也是出于类似的原因。关于小鲍比故事的帖子(关于def
),TexSoup 不处理定义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)