![部分之间的依赖关系](https://linux22.com/image/233053/%E9%83%A8%E5%88%86%E4%B9%8B%E9%97%B4%E7%9A%84%E4%BE%9D%E8%B5%96%E5%85%B3%E7%B3%BB.png)
我正在写一个如下的文档:
\section{A}\input{A}
\section{B}\input{B}
\section{C}\input{C}
...
每个部分都提供了一些内容,但要求在之前包含其他部分。例如,B 可能需要 A 和 C,C 可能需要 A,而 A 可能不需要任何东西。在这种情况下,上面的代码应该只将 A 和 C 放在输出文档中,因为 B 在 C 之前。我尝试使用 ifthen 包,但未能获得一个如果顺序错误则不会产生编译错误的解决方案。特别是,它会抱怨未声明的布尔变量,因为可能发生这种情况,我在加载声明它的部分之前检查布尔变量。
有什么想法吗?谢谢。
答案1
根据 Caramdir 的评论,我将在 ConTeXt 中执行此操作。也许有人可以将解决方案翻译成 LaTeX
\取消保护 \def\markedinput#1% {\letvalue{@@input@@#1@@}\empty \输入文件{#1}} \def\checkdependency#1% {\doifundefined{@@input@@#1@@}\endinput} \保护
然后使用
\section{A}\markedinput{A} \section{B}\markedinput{B} \section{C}\markedinput{C}
每个文件都可以以
\检查依赖项{A} \检查依赖项{C}
当然,这无法检查未来的依赖关系。
答案2
类似下面的操作会起作用吗?
\let\sectionAincluded\relax
This is section A.
\ifx\sectionAincluded\relax
\ifx\sectionCincluded\relax
\let\sectionBincluded\relax
This is section B.
\fi
\fi
\ifx\sectionAincluded\relax
\let\sectionCincluded\relax
This is section C.
\fi
这里\ifx
测试是否\sectionXincluded
已定义并且等同于\relax
(而不是\relax
可以使用任何其他标记)。
编辑:将 Aditya 的答案转变为不依赖于 ConTeXt 的内容:
%in main.tex
\makeatother
\def\markedinput#1%
{\expandafter\let\csname @@input@@#1@@\endcsname\empty
\input{#1}}
\def\checkdependency#1%
{\expandafter\ifx\csname @@input@@#1@@\endcsname\empty\else\endinput\fi}
\makeatletter
% A.tex
This is section A.
% B.tex
\checkdependency{A}
\checkdependency{C}
This is section B.
% C.tex
\checkdependency{A}
This is section C.
答案3
我认为您在这里想要的是对您的部分进行拓扑排序。这实际上相当容易做到。这是一个完全 LaTeX 解决方案(根本没有使用普通的 TeX 宏)。
\begin{filecontents}{A.tex}
\depend{B}
\depend{C}
\section{A}
This depends on B and C.
\end{filecontents}
\begin{filecontents}{B.tex}
\depend{C}
\section{B}
This depends on C.
\end{filecontents}
\begin{filecontents}{C.tex}
%\depend{B}
\section{C}
Uncommenting the \verb+\depend{B}+ causes a circular dependency.
\end{filecontents}
\documentclass{article}
\usepackage{etoolbox}
\usepackage{currfile}
\newcommand*\depend[1]{%
\ifcsdef{depend@#1}{}{%
\ifcsdef{resolving@#1}{%
\circulardependencyerror
}{}%
\cslet{resolving@\currfilebase}\relax
\input{#1}%
\csundef{resolving@\currfilebase}%
\cslet{depend@#1}\relax
}%
}
\begin{document}
\depend{A}
\end{document}
该filecontents
环境只是导致 TeX 逐字地写出这些文件。
\depend
检查其参数是否已输入。如果已输入,则不发生任何事情。如果尚未输入,则检查是否正在输入\input
。如果是,则存在需要解决的循环依赖关系。如果不是循环的,则输入文件并将其标记为已完成。