首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得...\end文件中的所有`\begin{definition} LaTeX {definition}块?

如何获得...\end文件中的所有`\begin{definition} LaTeX {definition}块?
EN

Stack Overflow用户
提问于 2015-06-10 09:26:31
回答 3查看 3.5K关注 0票数 3

我刚用Latex写完微积分的摘要。

现在的主要问题是文件包含了很多我现在并不真正需要的东西。

.tex文件包含了许多我需要用心学习的定义和定理。

这些定义在tex文件中有自己的定义,因此文件中的任何定义都将以以下方式开头:

代码语言:javascript
复制
\begin{definition}

并以

代码语言:javascript
复制
\end{definition}

定理也是如此。

我需要写一些东西来去掉\begin{}...\end{}里面的任何东西。

例如,在一个名为A的列表中:

代码语言:javascript
复制
\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}]]

在这个站点上,我发现我可以使用正则表达式:

代码语言:javascript
复制
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,我真的不知道为什么。

编辑:

代码语言:javascript
复制
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)

输出如下:

代码语言:javascript
复制
[]
[]
[]
[]
[]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-10 09:36:32

根据我从问题中得到的,你只需要Latex文件中的定义。您可以使用findall直接获得定义:

代码语言:javascript
复制
A = re.findall(r'{definition}(.*?)\\end{definition}', raw.read())

注意.*?的用法,以解决贪婪正则表达式匹配问题

票数 4
EN

Stack Overflow用户

发布于 2021-01-29 07:08:44

在本例中,正则表达式在大多数LaTeX文件中运行良好,但是对于更复杂的任务,您应该使用LaTeX解析器库。

这个问题可以用这样的pylatexenc来解决:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2021-01-29 15:57:53

您可以让latex完成这项工作,不需要使用python的外部解决方案。使用extract包,您可以指定要提取的环境,它将生成第二个具有所需内容的.tex文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30752351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档