我正在尝试详细了解目录是如何生成的。但是在检查了 .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
文件分为两个阶段:
该条目写在
.aux
文件中;你确实会发现\@writefile{toc}{\contentsline {chapter}{\numberline {1}Title without slash Author}{3}}
在里面
当该
.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
是强大的)。