макросы/команды внутри среды filecontents* не расширяются

макросы/команды внутри среды filecontents* не расширяются

Я хотел бы обратиться к вам за помощью по следующему вопросу.

Рассмотрим следующий MWE1:

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

Работает отлично. Создается внешний файл "dummy.tex" с содержимым "здесь какой-то текст и математика $A=s^2$".

Теперь рассмотрим следующий 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}

Также создается внешний файл "dummy.tex", но с содержимым "\somecommand". Вместо этого я хотел бы, чтобы файл содержал "какой-нибудь текст и математику здесь $A=s^2$".

Теперь рассмотрим следующий 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}

Также создается внешний файл "dummy.tex", но с содержимым

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

Вместо этого я бы хотел, чтобы файл содержал

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

Есть ли способ поместить команды и макросы внутрь filecontents*среды и сделать так, чтобы внешний файл содержал расширенные команды и макросы? (Я понимаю, что filecontents*это будет выглядеть как дословно.) Если нет filecontents*, то есть ли другой пакет/среда, которые могут это сделать?

Очень прошу вашей помощи. Спасибо.

решение1

Поскольку вы сами себе поставили диагноз, filecontentsчитаете вещи дословно, то \commandи zcommandони примерно одинаковы.

С несколькими изменениями его можно изменить, чтобы MWE2 работал, потому что \somecommandэто простой макрос, который расширяется до текста. Например, вот макрос \filecontentsspecials<esc><bgroup><egroup>, который заставляет следующую filecontentsсреду использовать символ <esc>как экранирующий символ (обычно \), <bgroup>как символы begin- и <egroup>end-group (обычно {и} соответственно).Важный: \filecontentsspecials\\\{\}волянетработа. Выбранные символы не могут быть ни одним из \\\{\}. |[], например, допустимы.

После того, как вы используете \filecontentsspecials, следующий (и только следующий)filecontents будет выполнять заполнение расширения его содержимого, расширяя макросы.нетдля расширения необходимо иметь префикс |noexpandили обернуть в |unexpanded[...]. Вот код:

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

и файл будет содержать:

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

MWE3 невозможен (по крайней мере, при разумных усилиях), поскольку \ifthenelseне «просто расширяется» до текста.

Связанный контент