\addcontentsline
当页面“发货”时,会将其写入目录。如果命令位于空白页上,且未写入 pdf 或 dvi,则会丢失。
问题:我该如何让\addcontentsline
下面的空白页工作?,无需添加可见的文本。
\documentclass{article}
\begin{document}
\tableofcontents
blub
\addcontentsline{toc}{section}{section 1}
\newpage
%empty page
\addcontentsline{toc}{section}{section 2} %lost
\end{document}
我还对只有 的部分感兴趣figure
。在这样的部分中addcontentsline
不起作用。我想要一个解决方案,这样我就不必把addcontentsline
里面使其figure
能够工作。
答案1
我对这个问题的理解是,你想要\addcontentsline
一个具有新页码的“虚拟”页面,但不需要最终文档中的页面,因为它是在其他地方生成的。
\addcontentsline
\write
如果页面已发送,则使用实际执行的延迟写入,其中包含写入节点。但是 TeX 也知道使用\immediate
before 的立即写入\write
。
延迟写入的原因是,页码至少在输出时在输出例程中是已知的,该例程通常在稍后的时间异步调用。然而,在问题的情况下,我们正位于\newpage
新页面顶部之后。这\thepage
是已知的并且有效的。
该示例定义了\NoPageAddContentsLine
本地重新定义\protected@write
:
\immediate\write
用来代替延迟的\write
。\protect
必须简化为\noexpand
。原文使用了一个额外的扩展级别,而这个扩展级别对于书写\protected@write
来说并不需要。\immediate
\documentclass{article}
\makeatletter
\newcommand*{\NoPageAddContentsLine}[3]{%
\begingroup
\newpage
\let\protected@write\protected@immediate@write
\addcontentsline{#1}{#2}{#3}%
\endgroup
\stepcounter{page}%
}
\newcommand{\protected@immediate@write}[3]{%
\begingroup
#2%
\let\protect\noexpand
\immediate\write#1{#3}%
\endgroup
}
\makeatother
\begin{document}
\tableofcontents
\listoffigures
\bigskip
\hrule
\noindent
blub
\addcontentsline{toc}{section}{section 1}
\NoPageAddContentsLine{toc}{section}{section 2}
\NoPageAddContentsLine{lof}{section}{figure 9}
\end{document}
结果:PDF文件1仅页面并为虚拟页面更正页码。
答案2
为了解决您提到的第一个问题,请\null
在原本空白的页面上添加类似的内容。
要将“隐形人物”——无论它是什么……——添加到人物列表中,您应该使用如下指令
\addcontentsline{lof}{section}{figure 9}
当然,还要添加\listoffigures
打印图表列表的说明。如果包含说明的页面\addcontentsline{lof}{section}{figure 9}
完全是空白的,请务必\null
也提供说明...
\documentclass{article}
\begin{document}
\tableofcontents
\listoffigures
\bigskip
\hrule
\noindent
blub
\addcontentsline{toc}{section}{section 1}
\newpage
\null
%empty page
\addcontentsline{toc}{section}{section 2} % no longer lost b/c page no longer completely empty
\newpage
\addcontentsline{lof}{section}{figure 9}
\null
\end{document}
答案3
要将您的条目添加到目录中而不添加额外的空格,您可以使用以下新命令:
\newcommand{\acl}[3]{
\begingroup
\let\newpage\relax
\null
\addcontentsline{#1}{#2}{#3}
\endgroup}
您可以使用\acl
(或您想要赋予的任何其他名称),就像使用 一样\addcontentsline
。
代码解释:
\newcommand
定义新命令(第一个参数),该命令接受其选项中指定的参数数量,并在其第二个参数中执行代码。这里,新参数是\acl
,它接受三个参数,就像\addcontentsline
!一样。\begingroup
并将\endgroup
代码封闭在他们之间的小安全天堂中。\let\newpage\relax
确保 LaTeX 即使想要开始新页面也无法开始。- 因为放松是在团体之间进行的,所以命令
\newpage
将在团体之外正常起作用。