Как разобрать файл 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
файл с нужным содержимым.