重新定义 ToC、LoF 和 LoT

重新定义 ToC、LoF 和 LoT

之前我使用下面的方法生成 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}

相关内容