如何在 LaTeX 文件中获取所有的 `\begin{definition}...\end{definition}` 块?
How can I get all the `\begin{definition}...\end{definition}` blocks in a LaTeX file?
我刚刚用 Latex 写完了微积分的总结。
现在的主要问题是文件中包含很多我现在并不真正需要的东西。
.tex 文件包含许多我需要用心学习的定义和定理。
这些定义在 tex 文件中有自己的定义,因此文件中的任何定义都将以:
\begin{definition}
并以
结尾
\end{definition}
定理也是如此。
我需要写一些东西来取出 \begin{}...\end{}
里面的东西。
例如在名为 A 的列表中:
\begin{document}
\begin{center}
\begin{definition} Hello WOrld! \end{definition}
\begin{example}A+B \end{example}
\begin{theorem} Tre Capre \end{theorem}
\begin{definition} Hello WOrld2! \end{definition}
\end{center}
\end{document}
应该包含:[[\begin{definition} Hello WOrld! \end{definition}],[\begin{theorem} Tre Capre \end{theorem}],[\begin{definition} Hello WOrld2! \end{definition}]]
在这个网站上我发现我可以使用正则表达式:
for i in range(5):
x = i+1
raw = open('tex/chapter' + str(x) + '.tex')
A = []
for line in raw:
A.append(re.match(r'(\begin{definition})://.*\.(\end{definition})$', line))
print(A)
但输出只是 None
,我真的不知道为什么。
编辑:
import re
for i in range(5):
x = i+1
raw = open('tex/chapter' + str(x) + '.tex')
A = re.findall(r'\begin{definition}(.*?)\end{definition}', raw.read())
print(A)
输出如下:
[]
[]
[]
[]
[]
根据我从问题中得到的信息,您只需要 Latex 文件中的定义。您可以使用 findall
直接获取您的定义:
A = re.findall(r'{definition}(.*?)\end{definition}', raw.read())
注意 .*?
的用法,以解决 greedy 正则表达式匹配问题
虽然在这种情况下正则表达式适用于大多数 LaTeX 文件,但对于更复杂的任务,您应该使用 LaTeX 解析器库。
这个问题可以用 pylatexenc
解决:
from pylatexenc import latexwalker
from pylatexenc.latexwalker import LatexWalker, make_json_encoder
data="(LaTeX source code)"
def traverse(node: latexwalker.LatexNode)->None:
if node.isNodeType(latexwalker.LatexEnvironmentNode):
if node.environmentname=="definition":
# Print the raw LaTeX of the whole node including the \begin{definition}
print(node.latex_verbatim())
# ... or without
print("".join(x.latex_verbatim() for child in node.nodelist))
for child in node.nodelist: traverse(child)
for node in LatexWalker(data).get_latex_nodes()[0]:
traverse(node)
您可以让 Latex 完成这项工作,不需要使用 python 的外部解决方法。使用 extract
包,您可以指定要提取的环境,它将生成包含所需内容的第二个 .tex
文件。
我刚刚用 Latex 写完了微积分的总结。
现在的主要问题是文件中包含很多我现在并不真正需要的东西。
.tex 文件包含许多我需要用心学习的定义和定理。
这些定义在 tex 文件中有自己的定义,因此文件中的任何定义都将以:
\begin{definition}
并以
结尾\end{definition}
定理也是如此。
我需要写一些东西来取出 \begin{}...\end{}
里面的东西。
例如在名为 A 的列表中:
\begin{document}
\begin{center}
\begin{definition} Hello WOrld! \end{definition}
\begin{example}A+B \end{example}
\begin{theorem} Tre Capre \end{theorem}
\begin{definition} Hello WOrld2! \end{definition}
\end{center}
\end{document}
应该包含:[[\begin{definition} Hello WOrld! \end{definition}],[\begin{theorem} Tre Capre \end{theorem}],[\begin{definition} Hello WOrld2! \end{definition}]]
在这个网站上我发现我可以使用正则表达式:
for i in range(5):
x = i+1
raw = open('tex/chapter' + str(x) + '.tex')
A = []
for line in raw:
A.append(re.match(r'(\begin{definition})://.*\.(\end{definition})$', line))
print(A)
但输出只是 None
,我真的不知道为什么。
编辑:
import re
for i in range(5):
x = i+1
raw = open('tex/chapter' + str(x) + '.tex')
A = re.findall(r'\begin{definition}(.*?)\end{definition}', raw.read())
print(A)
输出如下:
[]
[]
[]
[]
[]
根据我从问题中得到的信息,您只需要 Latex 文件中的定义。您可以使用 findall
直接获取您的定义:
A = re.findall(r'{definition}(.*?)\end{definition}', raw.read())
注意 .*?
的用法,以解决 greedy 正则表达式匹配问题
虽然在这种情况下正则表达式适用于大多数 LaTeX 文件,但对于更复杂的任务,您应该使用 LaTeX 解析器库。
这个问题可以用 pylatexenc
解决:
from pylatexenc import latexwalker
from pylatexenc.latexwalker import LatexWalker, make_json_encoder
data="(LaTeX source code)"
def traverse(node: latexwalker.LatexNode)->None:
if node.isNodeType(latexwalker.LatexEnvironmentNode):
if node.environmentname=="definition":
# Print the raw LaTeX of the whole node including the \begin{definition}
print(node.latex_verbatim())
# ... or without
print("".join(x.latex_verbatim() for child in node.nodelist))
for child in node.nodelist: traverse(child)
for node in LatexWalker(data).get_latex_nodes()[0]:
traverse(node)
您可以让 Latex 完成这项工作,不需要使用 python 的外部解决方法。使用 extract
包,您可以指定要提取的环境,它将生成包含所需内容的第二个 .tex
文件。