Makros/Befehle innerhalb einer filecontents*-Umgebung werden nicht erweitert

Makros/Befehle innerhalb einer filecontents*-Umgebung werden nicht erweitert

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, filecontentsliest man die Dinge wörtlich, also sind \commandund zcommandziemlich gleich.

Mit ein paar Änderungen kann es so geändert werden, dass MWE2 funktioniert, da es \somecommandsich 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. ) filecontentszu 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 \filecontentsspecialsder nächste (und nur der nächste) die Füllerweiterung seines Inhalts durch, indem Makros erweitert werden.filecontentsnichtzu erweiternde Elemente sollten mit dem Präfix versehen |noexpandoder 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 \ifthenelsees sich nicht „einfach zu Text erweitern“ lässt.

verwandte Informationen