我编写了一个包装器,\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
不会创建文件。愚蠢的错误。