2009-10-02 4 views
7

Comment puis-je remplacer toutes les occurrences de macros latex définies par l'utilisateur avec leurs définitions?comment remplacer les macros latex avec leurs définitions (en utilisant du latex)

Par exemple, étant donné ce fichier

old.tex

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

comment générer le fichier ci-dessous de manière automatique

new.tex

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

Au lieu de réimplémentation de la macro logique latex avec perl, puis-je utiliser le latex ou le moteur tex lui-même pour faire cela?

+0

Question intéressante. Je pense que c'est vraiment difficile, voire impossible. Un script TeX approprié devrait analyser chaque jeton dans chaque ligne et vérifier s'il s'agit d'une commande définie par l'utilisateur, ce qui, à mon avis, est assez complexe. Des choses comme les changements de codes cataclysmes dans le document le compliquent encore plus. Je suggère que vous essayez de trouver une solution complètement différente. TeX est bien pour composer un fichier de sortie DVI ou PDF à partir d'un fichier d'entrée, mais tout le reste est extrêmement compliqué. – Philipp

+0

Il est probablement préférable d'utiliser perl ou la langue de votre choix pour analyser vos fichiers .tex et remplacer les macros. – Mica

+0

[This] (http://stackoverflow.com/questions/2462656/transform-a-tex-source-so-that-all-macros-are-replaced-by-their-definition) la question stackoverflow a une réponse pour cela : [tme] (http://www.astro.indiana.edu/~jthorn/software.html#tme) – Mauro

Répondre

0

jamais vu cela, mais 2 idées bancales:

  1. Si la raison pour laquelle vous souhaitez développer toutes ces macros en ligne est pour le débogage, puis la mise en \tracingmacros=1 dans votre document étendra toutes vos macros , mais la sortie va à un fichier journal.

  2. L'archive CTAN fournit une package que vous pouvez utiliser pour l'expansion inline dans les définitions (mais pas newcommand), mais je ne sais pas si vous pouvez jeter un oeil et voir comment douloureuse il pourrait être de modifier pour effectuer en ligne expansions de \ newcommand au lieu de \ def.

1

Pensez à utiliser un moteur de template tel que Jinja2 avec Python.

Vous pouvez changer la syntaxe par défaut {%, {{, etc. afin de la rendre plus compatible avec celle de LaTeX. Par exemple:

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) 

En plus des fonctions qui sont transmises à l'environnement du modèle, Jinja2 prend en charge macros. Par exemple, votre code ci-dessus devrait fonctionner comme prévu que:

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

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

Je ne sais pas quels sont vos objectifs, et cela nécessite un peu de travail, mais il est pas un problème insurmontable du tout si vous êtes familier avec Python.

J'espère que cela aide.

7

VOILÀ http://www.ctan.org/tex-archive/support/de-macro

Ceci est un Python:

[...] va développer des macros définies dans (re) newcommand ou (re) commandes newenvironment, dans le document, ou le fichier de package "privé" du document.

+0

Nice. (C'est un script Python, mais peut être utile à quelqu'un qui lit cette question.) – ShreevatsaR

+1

L'adresse semble avoir changé: http://www.ctan.org/tex-archive/support/de-macro –

+0

Si je peux Je vais t'aimer pour toujours, étranger d'il y a 4 ans. –