macros/comandos dentro de um ambiente filecontents* não se expandem

macros/comandos dentro de um ambiente filecontents* não se expandem

gostaria de pedir sua ajuda no seguinte.

Considere o seguinte 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 bem. Um arquivo externo "dummy.tex" é criado com o conteúdo "algum texto e matemática aqui $A=s^2$".

Agora, considere o seguinte 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}

Também é criado um arquivo externo "dummy.tex", mas com o conteúdo "\somecommand". O que eu gostaria é que o arquivo contenha "algum texto e matemática aqui $A=s^2$".

Agora, considere o seguinte 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}

Também é criado um arquivo externo "dummy.tex", mas com o conteúdo

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

O que eu gostaria é que o arquivo contenha

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

Existe uma maneira de colocar comandos e macros dentro do filecontents*ambiente e fazer com que o arquivo externo contenha os comandos e macros expandidos? (Eu entendo filecontents*que se comporte literalmente.) Caso contrário filecontents*, existe outro pacote/ambiente que possa conseguir isso?

Por favor, busque sua ajuda. Obrigado.

Responder1

Como você se diagnosticou, filecontentslê as coisas literalmente, então \commande zcommandsão praticamente iguais.

Com algumas alterações, ele pode ser alterado para fazer o MWE2 funcionar porque \somecommandé uma macro simples que se expande para texto. Por exemplo, aqui está uma \filecontentsspecials<esc><bgroup><egroup>macro, que faz com que o próximo filecontentsambiente use o caractere <esc>como caractere de escape (geralmente \), como caracteres de grupo <bgroup>inicial e final (geralmente e respectivamente).<egroup>{}Importante: \filecontentsspecials\\\{\}vainãotrabalhar. Os caracteres escolhidos não podem ser nenhum dos \\\{\}. |[], por exemplo, são válidos.

Depois de usar \filecontentsspecials, o próximo (e somente o próximo) filecontentsrealizará a expansão de preenchimento de seu conteúdo, expandindo as macros. Coisasnãoa ser expandido deve ser prefixado |noexpandou encapsulado em |unexpanded[...]. Aqui está o 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}

e o arquivo conterá:

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

MWE3 não é possível (com um esforço razoável, pelo menos) porque \ifthenelsenão “simplesmente se expande” para texto.

informação relacionada