之前我使用下面的方法生成 ToC、LoF 和 LoT:
\newpage
\tableofcontents
\newpage
\listoffigures
\phantomsection
\addcontentsline{toc}{section}{\listfigurename}
\newpage
\listoftables
\phantomsection
\addcontentsline{toc}{section}{\listtablename}
现在,我正在尝试编写一个类文件,我想让它们“自动”从新页面开始,并在以下情况下将 LoF 和 LoT 添加到 ToC:
\tableofcontents
\listoffigures
\listoftables
叫做。
我正在尝试使用原始命令“重新定义”上述 3 个命令,但如果没有 Fortune,它就不起作用(没有新页面,并且 LoF 和 LoT 不会添加到 ToC):
\let\oldtableofcontents\tableofcontents
\def\tableofcontents{
\newpage
\oldtableofcontents
}
\let\oldlistoffigures\listoffigures
\def\listoffigures{
\newpage
\oldlistoffigures
\phantomsection
\addcontentsline{toc}{section}{\listfigurename}
}
\let\oldlistoftables\listoftables
\def\listoftables{
\newpage
\oldlistoftables
\phantomsection
\addcontentsline{toc}{section}{\listtablename}
}
如果有人能告诉我我的方法是否有问题,我将不胜感激(我对 \appendix 做了一些同样的事情并且它运行正常)
谢谢,
戈尔森
答案1
您将\phantomsection
和\addcontentsline
放在了错误的位置:它们应该在转到新页面后立即出现,否则,如果图表列表占据了多页,目录中的页码引用就会出错。此外,锚点将位于列表的开头,而不是结尾。
做你想做的事情的最简单的方法是加载etoolbox
:
\usepackage{etoolbox}
\preto\listoffigures{%
\clearpage
\csname phantomsection\endcsname
\addcontentsline{toc}{section}{\listfigurename}%
}
\preto\listoftables{%
\clearpage
\csname phantomsection\endcsname
\addcontentsline{toc}{section}{\listtablename}%
}
我之所以选择它,\clearpage
是因为它的“编程更好”,但实际上应该没有什么区别;我也用过
\csname phantomsection\endcsname
这样它就可以独立于加载进行工作hyperref
。
答案2
只要放置\phantomsection
和指令,您的代码就应该可以工作\addcontentsline
在之前和\listoffigures
说明\listoftables
:
\let\oldtableofcontents\tableofcontents
\renewcommand\tableofcontents{%
\newpage
\oldtableofcontents}
\let\oldlistoffigures\listoffigures
\renewcommand\listoffigures{%
\newpage
\phantomsection
\addcontentsline{toc}{section}{\listfigurename}
\oldlistoffigures}
\let\oldlistoftables\listoftables
\renewcommand\listoftables{%
\newpage
\phantomsection
\addcontentsline{toc}{section}{\listtablename}
\oldlistoftables}
假设目录、图表列表和表格列表应该出现在文档的最开始,您可以通过将现有说明封装在指令中来自动生成它们\AtBeginDocument{...}
。
这是一个完整的 MWE(文档的“主体”显然是人为的,因为它只是为了在 ToC、LoF 和 LoT 中生成条目):
\documentclass{report} % select the document class that's right for you
\usepackage[colorlinks]{hyperref}
\AtBeginDocument{%
\newpage
\tableofcontents
\newpage
\phantomsection
\listoffigures
\addcontentsline{toc}{section}{\listfigurename}
\newpage
\phantomsection
\listoftables
\addcontentsline{toc}{section}{\listtablename}}
\begin{document}
\chapter{First chapter}
\begin{figure}\caption{A figure} \label{fig:first} \end{figure}
\begin{table} \caption{A table} \label{tab:first} \end{table}
\end{document}
该测试文档的目录如下所示:
附录:为了让你的序言更具结构性,你可以 (a) 创建一个名为 的单独宏,\tocloflot
该宏生成 ToC、LoF 和 LoT,然后 (b) 在\AtBeginDocument
调用中调用该宏。例如,如下所示:
\newcommand\tocloflot{%
\newpage
\tableofcontents
\newpage
\phantomsection
\listoffigures
\addcontentsline{toc}{section}{\listfigurename}
\newpage
\phantomsection
\listoftables
\addcontentsline{toc}{section}{\listtablename}}
\AtBeginDocument{\tocloflot}