了解如何生成目录

了解如何生成目录

我正在尝试详细了解目录是如何生成的。但是在检查了 .toc 文件之前和之后的“轻微”修改后,我现在完全糊涂了。我希望有人能帮我克服这个瓶颈。[最终目标是设计一个目录,我可以将章节标题(不是章节名称或章节编号)、作者和页码放在一行上,有时是两行。对于特定的书籍或报告,标题、作者或页面应按用户喜欢的顺序显示。标题应出现在一个标题中,作者应出现在另一个标题中:我怀疑这是后面的问题]

我从一个简单的文件开始,没什么特别的,只有 2 个章节。

\documentclass{book}
\usepackage{lipsum}
%\newcommand\autsection[2]{%
%  \chapter[#1~/ {\normalfont\small\itshape#2}] %
%  {#1 \\ {\normalfont\large\itshape#2}}} % 
\begin{document}
\tableofcontents
\chapter{Title without slash Author}
%\autsection{Title with slash Author}{Paul Isamber}
\lipsum[20-30]
\chapter{Very long title name without slash author or any other text in the title}
%\autsection{Very long title name with slash author following}{Joseph Wright and Timothy Hall}
\end{document}

他们生成了这个 .toc 文件。看上去很简单。

\contentsline {chapter}{\numberline {1}Title without slash Author}{3}
\contentsline {chapter}{\numberline {2}Very long title name without slash author or any other text in the title}{7}

然后我根据 G.Medina 的回答做了一点小修改(构建目录时自动添加作者姓名2012 年 3 月 10 日,作者:Gonzalo Medina)

\newcommand\autsection[2]{% alternative
    \section[#1~/ {\normalfont\small\itshape#2}] % optional part of \section
    {#1 \\ {\normalfont\large\itshape#2}}} % main part of \section

我用这两个宏替换了 \chapter 命令。

\autsection{Title with slash Author}{Paul Isamber}
\autsection{Very long title name with slash author following}{Joseph Wright and Timothy Hall}

.toc 文件的内容让我感到困惑。请注意,我重新格式化了文件以使其更易于阅读,并且仅包含引用第一章的代码

\contentsline {chapter}{\numberline {1}Title with slash Author
    \nobreakspace {}/ 
    {\normalfont \relax
        \fontsize {9}{11}\selectfont 
        \abovedisplayskip 8.5\p@ plus3\p@ minus4\p@ 
        \abovedisplayshortskip \z@ plus2\p@ 
        \belowdisplayshortskip 4\p@ plus2\p@ minus2\p@ 
        \def \leftmargin \leftmargini 
        \parsep 4\p@ plus2\p@ minus\p@ 
        \topsep 8\p@ plus2\p@ minus4\p@ 
        \itemsep 4\p@ plus2\p@ minus\p@ {%
            \leftmargin \leftmargini 
            \topsep 4\p@ plus2\p@ minus2\p@ 
            \parsep 2\p@ plus\p@ minus\p@ 
            \itemsep \parsep 
        }%
        \belowdisplayskip 
        \abovedisplayskip 
        \itshape Paul Isamber}
}%
{3}

这些“东西”是从哪里来的?哪些宏负责?我知道有几个默认值被重置了,但我不明白是什么在做这件事。我试图通过相关命令追溯可能的步骤,从 \chapter、\tableofcontents、\l@chapter、\addcontentsline、\contentsline、\@dottedtocline、\@chapter 和难以捉摸的 \@starttoc 开始。但我只是走进了死胡同!

答案1

写入.toc文件分为两个阶段:

  1. 该条目写在.aux文件中;你确实会发现

    \@writefile{toc}{\contentsline {chapter}{\numberline {1}Title without slash Author}{3}}
    

    在里面

  2. 当该.aux文件作为游戏结束程序的一部分输入时,这些命令会将条目写入一个新.toc文件中,以便下次运行期间可以在任何地方使用。

我们必须记住,这些指令是\protected@write通过完全扩展,除非它找到\protect一个标记(明确的或由扩展产生的)前面。

例如book.cls

\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}#1}

作为宏的一部分\@chapter;因此\numberline受到保护并且在写入操作期间不会过度扩展。

该命令\normalfont非常强大,这意味着它可以扩展为

\protect\normalfont•

(项目符号表示命令名称中的空格)。因此,最终写出的是字符串\normalfont••(一个空格,因为命令名称中有一个空格,一个空格,一如既往,跟在控制字后面)。当文件被读回时,这两个空格将被忽略,因为文件是\input

\itshape从同样的意义上来说也是强大的,但是\large\small却不是。

您应该在它们前面加上\protect;如果这样做,.toc文件将包含

\contentsline {chapter}{\numberline {2}Title with slash Author\nobreakspace {}/ {\normalfont \small \itshape Paul Isamber}}{5}

请注意,~将转换为\nobreakspace{},这是完全等价的,并且这种转换是无害的(\nobreakspace是强大的)。

相关内容