自动包含文件

自动包含文件

在我的上一个问题我问了模板。我得到了一个很酷的答案,谢谢!

有类似代码

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

相关内容