ich möchte Sie in folgendem Punkt um Ihre Hilfe bitten.
Betrachten Sie das folgende MWE1:
\documentclass{article}
\usepackage{filecontents}
\begin{document}
Hi
\begin{filecontents*}{dummy.tex}
some text and math here $A=s^2$
\end{filecontents*}
\end{document}
Es funktioniert einwandfrei. Eine externe Datei „dummy.tex“ wird mit dem Inhalt „etwas Text und Mathematik hier $A=s^2$“ erstellt.
Betrachten Sie nun das folgende MWE2:
\documentclass{article}
\usepackage{filecontents}
\newcommand*{\somecommand}{some text and math here $A=s^2$}%
\begin{document}
Hi
\begin{filecontents*}{dummy.tex}
\somecommand
\end{filecontents*}
\end{document}
Es wird auch eine externe Datei „dummy.tex“ erstellt, allerdings mit dem Inhalt „\somecommand“. Stattdessen hätte ich mir gewünscht, dass die Datei „hier etwas Text und Mathematik $A=s^2$“ enthält.
Betrachten Sie nun das folgende MWE3:
\documentclass{article}
\usepackage{ifthen}
\usepackage{filecontents}
\newcommand*{\somecommandA}{some text and math here $A=s^2$}%
\newcommand*{\somecommandB}{5}%
\begin{document}
Hi
\begin{filecontents*}{dummy.tex}
\somecommandA
\\
\ifthenelse{\equal{\somecommandB}{5}}{5}{4}
\end{filecontents*}
\end{document}
Es wird auch eine externe Datei "dummy.tex" erstellt, allerdings mit dem Inhalt
\somecommandA
\\
\ifthenelse{\equal{\somecommandB}{5}}{5}{4}
Stattdessen hätte ich den Wunsch, dass die Datei Folgendes enthält:
some text and math here $A=s^2$
5
Gibt es eine Möglichkeit, Befehle und Makros in die Umgebung einzufügen filecontents*
und die externen Dateien die erweiterten Befehle und Makros enthalten zu lassen? (Ich verstehe, dass filecontents*
sie sich wie wörtlich verhalten.) Wenn nicht filecontents*
, gibt es ein anderes Paket/eine andere Umgebung, mit der dies erreicht werden kann?
Ich bitte höflich um Ihre Hilfe. Danke.
Antwort1
Wie Sie selbst diagnostiziert haben, filecontents
liest man die Dinge wörtlich, also sind \command
und zcommand
ziemlich gleich.
Mit ein paar Änderungen kann es so geändert werden, dass MWE2 funktioniert, da es \somecommand
sich um ein einfaches Makro handelt, das in Text umgewandelt wird. Hier ist beispielsweise ein \filecontentsspecials<esc><bgroup><egroup>
Makro, das die nächste Umgebung dazu bringt, das Zeichen als Escape-Zeichen (normalerweise ), als Anfangs- und als Endgruppenzeichen (normalerweise bzw. ) filecontents
zu verwenden .<esc>
\
<bgroup>
<egroup>
{
}
Wichtig: \filecontentsspecials\\\{\}
Willenichtfunktionieren. Die gewählten Zeichen dürfen keines der folgenden sein \\\{\}
: . |[]
, zum Beispiel sind gültig.
Nachdem Sie verwendet haben , führt \filecontentsspecials
der nächste (und nur der nächste) die Füllerweiterung seines Inhalts durch, indem Makros erweitert werden.filecontents
nichtzu erweiternde Elemente sollten mit dem Präfix versehen |noexpand
oder darin eingeschlossen werden |unexpanded[...]
. Hier ist der Code:
\def\filecontentsspecials#1#2#3{
\global\let\ltxspecials\dospecials
\gdef\dospecials{\ltxspecials
\catcode`#1=0
\catcode`#2=1
\catcode`#3=2
\global\let\dospecials\ltxspecials
}
}
\documentclass{article}
\newcommand*{\somecommand}{some text and math here $A=s^2$}%
\begin{document}
Hi
\filecontentsspecials|[]
\begin{filecontents*}[overwrite]{dummy.tex}
|somecommand % this expands
\somecommand % this does not
\end{filecontents*}
\end{document}
und die Datei enthält:
some text and math here $A=s^2$ % this expands
\somecommand % this does not
MWE3 ist (zumindest mit vertretbarem Aufwand) nicht möglich, da \ifthenelse
es sich nicht „einfach zu Text erweitern“ lässt.