2009-10-02 21 views
7

¿Cómo puedo reemplazar todas las ocurrencias de macros de látex definidas por el usuario con sus definiciones?cómo reemplazar las macros de látex con sus definiciones (usando látex)

Por ejemplo, dado este archivo

old.tex

\newcommand{\blah}[2]{#1 \to #2} 
... 
foo \blah{egg}{spam} bar 
... 

cómo generar el archivo a continuación de forma automática

new.tex

... 
foo egg \to spam bar 
... 

En lugar de reimplantando la lógica de macro de látex con perl, ¿puedo usar latex o el propio motor de tex para hacer esto?

+0

Pregunta interesante. Creo que esto es realmente difícil, si no imposible. Un script TeX apropiado tendría que analizar cada token en cada línea y comprobar si es un comando definido por el usuario, lo que creo que es bastante complejo. Cosas como los cambios de código de catálogo en el documento lo complican aún más. Sugeriría que intentes encontrar una solución completamente diferente. TeX está bien para componer un archivo de salida DVI o PDF desde un archivo de entrada, pero cualquier otra cosa es extremadamente complicado. – Philipp

+0

Probablemente esté mucho mejor utilizando perl o el idioma de su elección para analizar sus archivos .tex y reemplazar las macros. – Mica

+0

[This] (http://stackoverflow.com/questions/2462656/transform-a-tex-source-so-that-all-macros-are-replaced-by-their-definition) La pregunta de stackoverflow tiene una respuesta para ella : [tme] (http://www.astro.indiana.edu/~jthorn/software.html#tme) – Mauro

Respuesta

0

Nunca visto este hecho, pero 2 de ideas a medio cocinar:

  1. Si la razón por la que desea expandir todas estas macros en línea es para la depuración, a continuación, establecer \tracingmacros=1 en el documento se ampliará todos sus macros , pero la salida va a un archivo de registro.

  2. El archivo CTAN proporciona una package que se puede utilizar para expansiones en línea dentro de las definiciones (pero no newcommand), pero yo no sabía si podría echar un vistazo y ver lo doloroso que puede ser modificar para realizar en línea expansiones de \ newcommand en lugar de \ def.

1

Considere el uso de un motor de plantillas como Jinja2 con Python.

Es posible que desee cambiar la sintaxis del valor predeterminado {%, {{, etc. para que sea más compatible con la propia LaTeX. Por ejemplo:

env = jinja2.Environment(
     loader=jinja2.FileSystemLoader(JINJA_DIRS), 
     comment_start_string='["', # don't conflict with e.g. {#1 
     comment_end_string = '"]', 
     block_start_string = '[%', 
     block_end_string = '%]', 
     variable_start_string = '[=', 
     variable_end_string = ']', 
     autoescape=True, 
     finalize=_jinja2_finalize_callback, # make a function that escapes TeX 
    ) 

template = env.get_template(self.template) 

tex = template.render(content) 

Además de las funciones que se pasan al medio ambiente de la plantilla, Jinja2 apoya macros. Por ejemplo, el código anterior debería funcionar como se espera como:

[% macro blah(egg, spam) -%] 
foo [=egg] \to [=spam] bar 
[%- endmacro %] 

[= blah("chicken","pork") ] 
% substitutes with "foo chicken \to pork" 

No estoy seguro de cuáles son sus objetivos, y esto requiere un poco de trabajo, pero no es un problema insuperable en absoluto si estás familiarizado con Python.

Espero que ayude.

7

Voilà http://www.ctan.org/tex-archive/support/de-macro

Se trata de un Python que:

[...] se expandirá macros definidas en (re) newcommand o (re) newenvironment comandos, dentro del documento o, en el archivo del paquete "privado" del documento.

+0

Agradable. (Es una secuencia de comandos de Python, pero aún puede ser útil para alguien que lea esta pregunta.) – ShreevatsaR

+1

La dirección parece haber cambiado: http://www.ctan.org/tex-archive/support/de-macro –

+0

Si puedo Haz que esto funcione Te amaré por siempre, extraño desde hace 4 años. –