programming – ¿Existe un script que lea un archivo TeX y reemplace cada instancia de un \ newcommand?

Pregunta:

Me gustaría saber si hay un script que lee un archivo .tex y reemplaza cada instancia de un comando TeX no estándar con lo que sea que esté reemplazando. No estoy seguro de si lo que quiero está claro pero déjame darte un ejemplo:

Suponga que la entrada es:

\documentclass{amsart} 
\usepackage{amsmath,amssymb}
\newcommand{\N}{\mathbb{N}}
\DeclareMathOperator{\End}{End}

\begin{document}
In this lecture we'll study the ring of Endomorphisms of an Abelian group $A$.
Let's denote this ring by $\End(A)$. Throughout the lecture, $\N$ will denote
the set of natural numbers.
\end{document} 

Entonces, un resultado deseable de dicho script es:

\documentclass{amsart}
\usepackage{amsmath, amssymb}
\begin{document}
In this lecture we'll study the ring of Endomorphisms of an Abelian group $A$.
Let's denote this ring by $\operatorname{End}(A)$. Throughout the lecture,  
 $\mathbb{N}$ will denote the set of natural numbers.
\end{document}

PD: Creo que había visto algo en este sentido, pero no recuerdo el lugar ni una palabra clave para iniciar Google.


Quería escribir eso, todas las respuestas aquí son increíbles, pero conté mal 2 por 4. 🙁

Respuesta:

Información La mafia de la sala de chat de TeX.sx me ha obligado a publicar mi hermosa, con errores, terrible, traumática y post-apocalíptica implementación de un guión de reemplazo por parte del pobre hombre. :)

Bueno, lamentablemente esta no será una respuesta de TeX. :) Aquí está mi humilde intento, con un lenguaje de escritura en el que soy terrible.

(¡Te estoy mirando, Python!)

import re
import sys

if len(sys.argv) != 3:
    print('We need two arguments.')
    sys.exit()

inputHandler = open(sys.argv[1], 'r')

mathDictionary = {}
commandDictionary = {}

print('Extracting commands...')
for line in inputHandler:
    mathOperator = re.search('\\\\DeclareMathOperator{\\\\([A-Za-z]*)}{(.*)}', line)
    if mathOperator:
        mathDictionary[mathOperator.group(1)] = mathOperator.group(2)
    newCommand = re.search('\\\\newcommand{\\\\([A-Za-z]*)}{(.*)}', line)
    if newCommand:
        commandDictionary[newCommand.group(1)] = newCommand.group(2)

inputHandler.seek(0)

print('Replacing occurrences...')
outputHandler = open(sys.argv[2],'w')
for line in inputHandler:
    current = line
    for x in mathDictionary:
        current = re.sub('\\\\DeclareMathOperator{\\\\' + x + '}{(.*)}', '', current)
        current = re.sub('\\\\' + x + '(?!\w)', '\\operatorname{' + mathDictionary[x] + '}', current)
    for x in commandDictionary:
        current = re.sub('\\\\newcommand{\\\\' + x + '}{(.*)}', '', current)
        current = re.sub('\\\\' + x + '(?!\w)', commandDictionary[x], current)
    outputHandler.write(current)

print('Done.')

inputHandler.close()
outputHandler.close()

Ahora, simplemente lo llamamos:

$ python myconverter.py input.tex output.tex
Extracting commands...
Replacing occurrences...
Done.

input.tex

\documentclass{amsart} 
\usepackage{amsmath,amssymb}
\newcommand{\N}{\mathbb{N}}
\DeclareMathOperator{\End}{End}

\begin{document}
In this lecture we'll study the ring of Endomorphisms of an Abelian group $A$.
Let's denote this ring by $\End(A)$. Throughout the lecture, $\N$ will denote
the set of natural numbers.
\end{document} 

output.tex

\documentclass{amsart} 
\usepackage{amsmath,amssymb}



\begin{document}
In this lecture we'll study the ring of Endomorphisms of an Abelian group $A$.
Let's denote this ring by $\operatorname{End}(A)$. Throughout the lecture, $\mathbb{N}$ will denote
the set of natural numbers.
\end{document} 

Limitaciones:

  • Es mi código, ¡así que ten cuidado! :)
  • Funciona solo con \DeclareMathOperator{...}{...} y \newcommand{...}{...} .
  • No se admiten argumentos opcionales para \newcommand .
  • La declaración debe estar en una sola línea.
  • Corchetes equilibrados, por favor. :)

Sé que las expresiones regulares no son adecuadas para analizar TeX, pero deberían funcionar para reemplazos muy simples.

Aquí hay una hermosa lectura sobre expresiones regulares . Divertirse. :)

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım