Las macros/comandos dentro de un entorno de contenido de archivo* no se expanden

Las macros/comandos dentro de un entorno de contenido de archivo* no se expanden

Me gustaría buscar su ayuda en lo siguiente.

Considere el siguiente MWE1:

\documentclass{article}
\usepackage{filecontents}
\begin{document}
Hi
\begin{filecontents*}{dummy.tex}
some text and math here $A=s^2$
\end{filecontents*}
\end{document}

Funciona bien. Se crea un archivo externo "dummy.tex" con el contenido "algo de texto y matemáticas aquí $A=s^2$".

Ahora, considere el siguiente 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}

También se crea un archivo externo "dummy.tex", pero con el contenido "\somecommand". En cambio, lo que me gustaría es que el archivo contenga "algo de texto y matemáticas aquí $A=s^2$".

Ahora, considere el siguiente 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}

También se crea un archivo externo "dummy.tex", pero con el contenido

\somecommandA
\\
\ifthenelse{\equal{\somecommandB}{5}}{5}{4}

Lo que me gustaría en cambio es que el archivo contenga

some text and math here $A=s^2$
5

¿Hay alguna manera de poner comandos y macros dentro del filecontents*entorno y hacer que el archivo externo contenga los comandos y macros expandidos? (Entiendo filecontents*que se comporta literalmente). Si no es así filecontents*, ¿existe otro paquete/entorno que pueda lograr esto?

Solicitamos amablemente su ayuda. Gracias.

Respuesta1

Como usted mismo diagnosticó, filecontentslee las cosas palabra por palabra, por lo que \commandy zcommandson más o menos lo mismo.

Con algunos cambios, se puede cambiar para que MWE2 funcione porque \somecommandes una macro simple que se expande a texto. Por ejemplo, aquí hay una \filecontentsspecials<esc><bgroup><egroup>macro, que hace que el siguiente filecontentsentorno use el carácter <esc>como carácter de escape (generalmente \), <bgroup>como carácter de inicio y <egroup>fin de grupo (generalmente {y }respectivamente).Importante: \filecontentsspecials\\\{\}voluntadnotrabajar. Los personajes elegidos no pueden ser ninguno de \\\{\}. |[], por ejemplo, son válidos.

Después de usar \filecontentsspecials, el siguiente (y sólo el siguiente) filecontentsrealizará una expansión completa de su contenido, expandiendo macros. Cosasnoque se va a expandir debe tener el prefijo |noexpando estar incluido en |unexpanded[...]. Aquí está el código:

\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}

y el archivo contendrá:

some text and math here $A=s^2$ % this expands
\somecommand % this does not

MWE3 no es posible (al menos con un esfuerzo razonable) porque \ifthenelseno “simplemente se expande” a texto.

información relacionada