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, filecontents
lê as coisas literalmente, então \command
e zcommand
sã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 filecontents
ambiente 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) filecontents
realizará a expansão de preenchimento de seu conteúdo, expandindo as macros. Coisasnãoa ser expandido deve ser prefixado |noexpand
ou 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 \ifthenelse
não “simplesmente se expande” para texto.