非嵌入的第一个输出文件

非嵌入的第一个输出文件

我编写了一个包装器,\tableofcontents \listoftables \listoffigures根据每种类型的出现次数来确定是否添加这些列表。换句话说,我添加了定量依赖关系。

问题是嵌入\tableofcontents另一个宏会推迟写入 .toc .lot .lof 文件。我已经进行了 3 次运行,我不想再运行一次。我想鱼与熊掌兼得。

非嵌入的第一个输出文件

toc.aux
toc.log
toc.pdf
toc.toc

嵌入的首次运行输出文件

请注意,将一个宏嵌入另一个宏中在第一次运行后\tableofcontents不会创建文件。\jobname.toc

toc.aux
toc.log
toc.pdf

有问题的代码

\documentclass{article}
\usepackage{fontspec}
\usepackage{xparse}% for \NewDocumentCommand
\usepackage{atveryend}% to add stuff to end of aux reliably

% Add running section counter
\newcounter{runningsectioncounter}
\setcounter{runningsectioncounter}{0}

% Inject count stepper into section
\makeatletter
\renewcommand\section{\addtocounter{runningsectioncounter}{1}\@startsection {section}{1}{\z@}%
                                   {-3.5ex \@plus -1ex \@minus -.2ex}%
                                   {2.3ex \@plus.2ex}%
                                   {\normalfont\Large\bfseries}}

% Contents Logic
\NewDocumentCommand\mycontents{}{%
  \ifnum 3<0\csname totalsectioncount\endcsname\relax\tableofcontents\newpage\fi
  \newpage
}%

% Write totals to aux after \end{document}
\AfterLastShipout{%
  \immediate\write\@mainaux{%
    \string\gdef\string\totalsectioncount{\the\c@runningsectioncounter}
  }%
}%
\makeatother

\begin{document}
\mycontents{}% <== embedded
%\tableofcontents{}% <== non-embedded

% TeX loop to generate sections for fun
\newcount\step
\step=0
\loop
  \advance \step 1
  \section{Section (ID: \the\step)}
\ifnum \step < 5\relax
  \repeat

\end{document}

我的第二次尝试

确实有效。

\documentclass{article}
\usepackage{fontspec}

\makeatletter
% Contents Logic
\protected@edef\mycontents{%
  \tableofcontents
  \newpage
}%
\makeatother

\begin{document}
\mycontents{}% <== embedded
%\tableofcontents{}% <== non-embedded

% TeX loop to generate sections for fun
\newcount\step
\step=0
\loop
  \advance \step 1
  \section{Section (ID: \the\step)}
\ifnum \step < 5\relax
  \repeat

\end{document}

答案1

如果我理解正确的话,您希望仅创建至少 4 个部分的目录。

存在两个问题:

  • (从注释中移出)仅当执行时才会创建 .toc 文件\tableofcontents。第一次编译时您不会执行\tableofcontents,因此最终需要运行三次。注释\usepackage{etoc}\etocnotocifnotoc在您的序言中替换您的代码,并且正常使用\tableofcontents将在仅 2 次运行中打印 TOC(如果存在)。但遗憾的是 etoc 不会挂接到 LOF 和 LOT。

  • 当它使用时,你的补丁也会\section受到影响\tableofcontents,因此你的计数器从它的使用开始加 1。

这可能是您所需要的,遵循现有的逻辑

\documentclass{article}
%\usepackage{fontspec}
\usepackage{xparse}% for \NewDocumentCommand
\usepackage{atveryend}% to add stuff to end of aux reliably

%\usepackage{etoc}
%\etocnotocifnotoc

% Add running section counter
\newcounter{runningsectioncounter}
\setcounter{runningsectioncounter}{0}

% Inject count stepper into section
\makeatletter
\renewcommand\section{\addtocounter{runningsectioncounter}{1}%
   \@startsection {section}{1}{\z@}%
                                   {-3.5ex \@plus -1ex \@minus -.2ex}%
                                   {2.3ex \@plus.2ex}%
                                   {\normalfont\Large\bfseries}}

% Contents Logic
\NewDocumentCommand\mycontents{}{%
  \ifnum 3<0\csname totalsectioncount\endcsname\relax
      \tableofcontents
      \addtocounter{runningsectioncounter}{-1}%
  \else
      \newwrite\tf@toc
      \immediate\openout\tf@toc=\jobname.toc\relax
  \fi
  \newpage
}%

% Write totals to aux after \end{document}
\AfterLastShipout{%
  \immediate\write\@mainaux{%
    \string\gdef\string\totalsectioncount{\the\c@runningsectioncounter}
  }%
}%
\makeatother

\begin{document}
\mycontents

% TeX loop to generate sections for fun
\newcount\step
\step=0
\loop
  \advance \step 1
  \section{Section (ID: \the\step)}
\ifnum \step < 5\relax
  \repeat

\end{document}

如果章节数不超过 3 个,则不会打印目录。如果章节数超过 3 个,则在运行两次后会完整打印目录。

答案2

我在重现您的结果时遇到了问题。xelatex 和 lualatex 都会产生您想要的输出。也就是说,如果您省略宏名称后的第二对括号:

\documentclass{article}
\usepackage{fontspec}

% Contents Logic
\def\mycontents{%
  \tableofcontents
  \newpage
}%
...

答案3

我试图\protected@edef充分扩展宏的内容\mycontents,我希望它也能调用\tableofcontents

这意外地起作用了。这与 无关\protected@edef。这与我还删除了节数条件这一事实有关。

解释

为什么我的条件在第一次运行后没有产生 TRUE?这与 TeX 是线性的事实有关。在\mycontents调用时,计数器runningsectioncounter仍设置为0。这意味着\tableofcontents不会调用并且\jobname.toc不会创建文件。愚蠢的错误。

相关内容