在我的上一个问题我问了模板。我得到了一个很酷的答案,谢谢!
有类似代码
\long\def\FourierIntroduction{Content}
比如说,在文件中Fourier.tex
,我想要的是,如果我包含Fourier.tex
我的模板(我事先制作的),这些注释(如果存在)将作为数据来生成所需的文档。
因此,假设我\include{Fourier}
在主文档中执行此操作(当然,可能include
需要修改),则打开此文档并搜索类似的命令\FourierIntroduction
(我将以文件本身命名第一部分以避免冲突,或者这不会发生吗?)。如果找到,模板应该执行:
\section{Introduction}
\FourierIntroduction
这样我就可以修改模板的顺序,重新运行文档并获得出色的结果。有什么建议可以解决这个难题吗?
编辑:我浏览了本网站,发现filehook
我们的一位版主提出了一个建议。我想知道这是否是一个好方法:
\usepackage{filehook}
\usepackage{currfile}
\def\Introduction{Introduction}
\AtEndOfEveryFile{%
\section{\currfilebase}%
\subsection{Introduction}%
\csname \currfilebase \Introduction \endcsname%
}
编辑#2:我尝试实现“环境”,但正如我所料,我失败了。我有以下最小非工作示例:
\documentclass[11pt]{article}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{filehook}
\usepackage{currfile}
\usepackage{environ}
\usepackage{comment}
\def\Introduction{Introduction}
\def\Methods{Methods}
\NewEnviron{introduction}{%
\long\def{\csname \currfilebase \Introduction \endcsname}{\BODY}%
}%
\AtEndOfEveryFile{%
\section{\currfilebase}%
\subsection{Introduction}%
\csname \currfilebase \Introduction \endcsname%
\subsection{Methods}%
\csname \currfilebase \Methods \endcsname%
}%
\begin{document}
\include{Fourier}
\end{document}
并Fourier.tex
包含如下内容:
\begin{introduction}
<TEST>
\end{introduction}
\long\def\FourierMethods{Test TWO}
我希望这个“例子”能够清楚地表明我的目标是什么。
编辑#3:感谢 canaaerus,我现在知道我应该“扩展”。因此,我应该替换
\NewEnviron{introduction}{%
\long\def{\csname \currfilebase \Introduction \endcsname}{\BODY}%
}%
和
\NewEnviron{introduction}{%
\expandafter\long\expandafter\xdef\csname \currfilebase \Introduction \endcsname{\BODY}%
}%
但显然这会搞乱amsmath
环境amsthm
。例如,如果我有文件Fourier.tex
,并且\include{Fourier}
当我将以下内容放在我的文件中时,我会收到错误Fourier.tex
:
\begin{introduction}
\begin{theorem}
Test: $f$.
\end{theorem}
More.
\end{introduction}
我怎样才能解决这个问题?
答案1
这看起来已经很不错了。你错过了两件事。首先,你需要\csname
在 之前进行扩展\def
。因此,\expandafter
去掉括号。接下来,新命令必须在当前范围之外可用,并且\BODY
只在定义时知道,因此必须在那里进行扩展。因此,你必须使用 的\xdef
缩写,\global\edef
而不是\def
。总而言之,这意味着:
\NewEnviron{introduction}{%
\expandafter\long\expandafter\xdef\csname \currfilebase \Introduction \endcsname{\BODY}%
}%
将会满足您的需要。
更通用的解决方案:
由于上面的版本在\BODY
不能完全展开时会出现问题,因此这里再试一次。我花了一些功夫,但我认为下面的版本将\BODY
恰好展开一次,从而给出正确的结果:
\NewEnviron{introduction}{%
\expandafter\long\expandafter\xdef\csname \currfilebase \Introduction \endcsname{\expandafter\unexpanded\expandafter{\BODY}}%
}%
关于扩展的一些解释:
为了简单起见,我们假设\BODY
仅包含Some \textbf{text}
,这也会在第一次尝试中触发问题。所以现在我们有
\expandafter\long\expandafter\xdef\csname \currfilebase \Introduction \endcsname{\expandafter\unexpanded\expandafter{\BODY}}
前两个\expandafter
步骤TeX
向\csname
-\endcsname
构造前进,并对其进行扩展,这样我们得到
\long\xdef{FourierIntroduction}{\expandafter\unexpanded\expandafter{\BODY}}
现在\xdef
尝试扩展整个第二个参数,并且这里仅受 抑制\unexpanded
。剩下的两个\expandafter
意味着TeX
跳过\unexpanded
和{
首先扩展\BODY
(一次)并留下
\long\xdef{FourierIntroduction}{\unexpanded{Some \textbf{text}}}
\xdef
因此,这是吃掉的点,并且不会进一步扩展(的内容)\unexpanded
的论点;留下类似\unexpanded
\BODY
\long\global\def{FourierIntroduction}{Some \textbf{text}}