Как разобрать файл LaTex

Я только что закончил писать резюме для исчисления в латексе.

Основная проблема сейчас заключается в том, что файлы содержат много вещей, которые мне сейчас не нужны.

Файлы.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)

вывод следующий:

[]
[]
[]
[]
[]

3 ответа

Решение

Из того, что я получаю из вопроса, вы просто хотите определения из латексного файла. Ты можешь использовать findall чтобы напрямую получить ваши определения:

A = re.findall(r'{definition}(.*?)\\end{definition}', raw.read())

Обратите внимание на использование для .*? для того, чтобы заняться сопоставлением жадных регулярных выражений

Хотя в этом случае регулярное выражение хорошо работает для большинства файлов 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)

Вы можете позволить латексу выполнять свою работу, нет необходимости во внешних обходных путях с python. С использованием extractпакет, вы можете указать, какие среды вы хотите извлечь, и он создаст второй .texфайл с нужным содержимым.

Другие вопросы по тегам