2009-10-02 6 views
7

Wie kann ich alle Vorkommen von benutzerdefinierten Latexmakros durch ihre Definitionen ersetzen?wie man Latexmakros mit ihren Definitionen ersetzt (unter Verwendung von Latex)

Zum Beispiel angesichts dieser Datei

old.tex

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

, wie die Datei unten in einer automatischen Art und Weise

new.tex

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

zu erzeugen, statt Reimplementierung Latex Makro Logik mit Perl, kann ich Latex oder Tex-Engine selbst verwenden, um dies zu tun?

+0

Interessante Frage. Ich denke, das ist wirklich schwer, wenn nicht unmöglich. Ein entsprechendes TeX-Skript müsste jedes Token in jeder Zeile analysieren und prüfen, ob es sich um einen benutzerdefinierten Befehl handelt, was meiner Meinung nach ziemlich komplex ist. Dinge wie Catcode-Änderungen im Dokument erschweren es noch weiter. Ich würde vorschlagen, dass Sie versuchen, eine völlig andere Lösung zu finden. TeX eignet sich gut zum Einstellen einer DVI- oder PDF-Ausgabedatei aus einer Eingabedatei, aber alles andere ist extrem kompliziert. – Philipp

+0

Sie sind wahrscheinlich besser dran mit Perl oder der Sprache Ihrer Wahl, um Ihre .tex-Dateien zu parsen und die Makros zu ersetzen. – Mica

+0

[This] (http://stackoverflow.com/questions/2462656/transform-a-tex-source-so-that-all-macros-are-replaced-by-their-definition) stackoverflow Frage hat eine Antwort dafür : [tme] (http://www.astro.indiana.edu/~jthorn/software.html#tme) – Mauro

Antwort

0

nie gesehen dies getan, aber 2 unausgegorene Ideen:

  1. Wenn der Grund, warum Sie alle diese Makros inline für das Debuggen ist erweitern möchten, dann \tracingmacros=1 in Ihrem Dokument Einstellung werden alle Ihre Makros erweitern , aber die Ausgabe geht in eine Protokolldatei.

  2. Das CTAN Archiv bietet eine package, die Sie Inline-Erweiterungen innerhalb Definitionen verwenden können (aber nicht newcommand), aber ich wusste nicht, ob Sie einen Blick darauf werfen könnte und sehen, wie schmerzhaft es könnte zu ändern sein inline auszuführen Erweiterungen von \ newcommand anstelle von \ def.

1

Verwenden Sie eine Vorlage-Engine wie Jinja2 mit Python.

Möglicherweise möchten Sie die Syntax von den Standardwerten {%, {{usw.) ändern, um sie besser mit LaTeXs eigenen kompatibel zu machen. Zum Beispiel:

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) 

Neben den Funktionen, die auf die Vorlage Umgebung übergeben werden, unterstützt Jinja2 macros. Zum Beispiel sollte Ihr obigen Code wie erwartet als:

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

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

Ich bin nicht sicher, was Ihre Ziele sind, und dies erfordert ein wenig Arbeit, aber es ist kein unüberwindbares Problem überhaupt, wenn Sie vertraut mit Python.

Ich hoffe, dass hilft.

7

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

Dies ist ein Python, dass:

[...] wird Makros erweitern definiert in (Wieder-) newcommand oder (Wieder-) newenvironment Befehle innerhalb des Dokuments oder in die "private" Paketdatei des Dokuments.

+0

Schön. (Es ist ein Python-Skript, kann aber trotzdem hilfreich sein, wenn jemand diese Frage liest.) – ShreevatsaR

+1

Die Adresse scheint sich geändert zu haben: http://www.ctan.org/tex-archive/support/de-macro –

+0

Wenn ich kann hol dir das Arbeiten Ich werde dich für immer lieben, Fremder vor 4 Jahren. –