Я хотел бы обратиться к вам за помощью по следующему вопросу.
Рассмотрим следующий 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
не «просто расширяется» до текста.