部分之间的依赖关系

部分之间的依赖关系

我正在写一个如下的文档:

\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。如果是,则存在需要解决的循环依赖关系。如果不是循环的,则输入文件并将其标记为已完成。

相关内容