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ó, filecontents
lee las cosas palabra por palabra, por lo que \command
y zcommand
son más o menos lo mismo.
Con algunos cambios, se puede cambiar para que MWE2 funcione porque \somecommand
es una macro simple que se expande a texto. Por ejemplo, aquí hay una \filecontentsspecials<esc><bgroup><egroup>
macro, que hace que el siguiente filecontents
entorno 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) filecontents
realizará una expansión completa de su contenido, expandiendo macros. Cosasnoque se va a expandir debe tener el prefijo |noexpand
o 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 \ifthenelse
no “simplemente se expande” a texto.