Я использую библиотеку pylatexen для анализа файла LateX (.tex) на узлы (кортежи). Для каждого узла, соответствующего условию, код LateX, соответствующий указанному узлу, удаляется или заменяется.
Как я могу гарантировать, что все различные изменения происходят (последовательно) в одном и том же тексте, а не чем создавать отдельные версии для каждого цикла, каждый со своим собственным редактированием?
from pylatexenc import latexnodes, latexwalker
from pylatexenc.latexnodes import LatexNodesCollector, LatexTokenReader
from pylatexenc.latexnodes.nodes import LatexEnvironmentNode, LatexCharsNode, LatexMacroNode, LatexGroupNode, LatexNode
from pylatexenc.latexnodes.parsers import LatexGeneralNodesParser
from pylatexenc.latexwalker import LatexWalker
import re
data=(r'''
\section{Heading}\label{heading-label}
\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
Pater noster qui est in caelis.
\end{enumerate}
\section{Heading 2}
\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\setcounter{enumi}{1}
\item
Et ne nos inducat in tempore malo.\footnote{footnote}
\item
Gratia plena dominus tecum.
\item
Panem nostrum quotidanum da nobis hodie.
\end{enumerate}
''')
my_latex_walker = LatexWalker(data)
my_reader = LatexTokenReader(data)
parsing_state = my_latex_walker.make_parsing_state()
nodes, parsing_state_delta = my_latex_walker.parse_content(LatexGeneralNodesParser())
def traverse(node):
#Parsing for enumerate environments with additional arguments and removing them
if node.isNodeType(LatexEnvironmentNode) and node.environmentname == "enumerate":
subnodes = node.nodelist
if subnodes[0].isNodeType(LatexCharsNode)\
and subnodes[1].macroname == "def"\
and subnodes[2].isNodeType(LatexMacroNode)\
and subnodes[2].macroname == "labelenumi"\
and subnodes[3].isNodeType(LatexGroupNode):
string_inside_environment = (subnodes.latex_verbatim())
string_with_environment = (node.latex_verbatim())
if subnodes[5].macroname == "setcounter":
to_remove = str(subnodes[0].latex_verbatim()) + str(subnodes[1].latex_verbatim()) + str(subnodes[2].latex_verbatim()) + str(subnodes[3].latex_verbatim()) + str(subnodes[4].latex_verbatim()) + str(subnodes[5].latex_verbatim())
else:
to_remove = str(subnodes[0].latex_verbatim()) + str(subnodes[1].latex_verbatim()) + str(subnodes[2].latex_verbatim()) + str(subnodes[3].latex_verbatim()) + str(subnodes[4].latex_verbatim())
cleaned_string = (string_inside_environment.replace(to_remove,''))
#Parsing the cleaned up string for first level \item commands and replace by \mypara
my_latex_walker2 = LatexWalker(cleaned_string)
itemnodes, parsing_state_delta2 = my_latex_walker2.parse_content(LatexGeneralNodesParser())
for itemnode in itemnodes:
if itemnode.isNodeType(LatexMacroNode) and itemnode.macroname == "item":
revamped_string = cleaned_string.replace(itemnode.latex_verbatim(), r'\mypara ')
result = data.replace(string_with_environment, revamped_string)
if node.isNodeType(LatexGroupNode): #Recurse into groupnodes
traverse(node)
for node in nodes:
traverse(node)
print(data)
Подробнее здесь: https://stackoverflow.com/questions/787 ... a-for-loop