我正在尝试格式化我的论文,格式指南要求章节和节等都使用虚线。问题是我有几个附录,单词“Chapter”的长度小于单词“Appendix”的长度,这导致获取间距的问题。.cls 样式是由另一位学生提供给我的,似乎与 tocloft 不兼容,因此不是\chapter
对我来说这是一个可行的解决方案。我可以通过重新定义和相应地使用书籍包来重现该问题\l@chapter
,因此修复就在这两个定义中的某个地方。
1型
在本篇 MWE 中,我改变了\l@chapter
以添加虚线,使用如何在没有 tocloft 的情况下向目录添加前导符?作为指导。但是请注意,“附录 A”和标题之间的间距太小。(这严格来说不是虚线问题,无论如何我都必须解决它,但(正如我将展示的),它们是复合的。
\documentclass{book}
\makeatletter
\renewcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
\thispagestyle{plain}%
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
\refstepcounter{chapter}%
\typeout{\@chapapp\space\thechapter.}%
\addcontentsline{toc}{chapter}%
{\protect\numberline{\@chapapp\hspace{2mm}\thechapter}\hspace{1.5cm}{#1}}%
\else
% \addcontentsline{toc}{chapter}{\MakeTextUppercase{#1}}%
\addcontentsline{toc}{chapter}{{#1}}%
\fi
\chaptermark{#1}%
\addtocontents{lof}{\protect\addvspace{0\p@}}%
\addtocontents{lot}{\protect\addvspace{0\p@}}%
\if@twocolumn
\@topnewpage[\@makechapterhead{#2}]%
\else
\@makechapterhead{#2}%
\@afterheading
\fi}
\renewcommand*\l@chapter[2]{%
\ifnum \c@tocdepth >\m@ne
\addpenalty{-\@highpenalty}%
\vskip 1.0em \@plus\p@
\setlength\@tempdima{1.5em}%
\begingroup
\parindent \z@ \rightskip \@pnumwidth
\parfillskip -\@pnumwidth
\leavevmode \normalfont
\advance\leftskip\@tempdima
\hskip -\leftskip
#1\nobreak
\leaders\hbox{$\m@th
\mkern \@dotsep mu\hbox{.}\mkern \@dotsep
mu$}\hfill%
\nobreak\hb@xt@\@pnumwidth{\hss #2}\par
\penalty\@highpenalty
\endgroup
\fi}
\makeatother
\begin{document}
\tableofcontents
\chapter{one longer title}
\chapter{two}
\chapter{three}
\appendix
\chapter{This needs to be right too}
\end{document}
微波辐射计
问题似乎在于从行首到文本首的空格是硬编码的,因此我删除了它,并将更多内容移到了命令内\numberline
。
(顺便说一句 - 我找不到任何文档来说明该怎么\numberline
做,有人知道吗?)这基本上将间距问题转移到了点而不是文本上 - 因此我接下来尝试做相反的事情,并从里面删除了所有内容\numberline
- 而且它几乎是正确的,但现在有一个缩进不会消失。(注意 - 如果有人不需要点,请更改{\protect\numberline{}\@chapapp\hspace{2mm}\thechapter\hspace{2mm}{#1}}%
为{\protect\numberline{\@chapapp\hspace{2mm}\thechapter\hspace{2mm}{#1}}}%
解决间距问题。我尝试过添加的常规方法\hspace{-.25in}
,但不起作用。我看不到这个缩进是在哪里定义的。
有人可以帮忙吗?
\documentclass{book}
\makeatletter
\renewcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
\thispagestyle{plain}%
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
\refstepcounter{chapter}%
\typeout{\@chapapp\space\thechapter.}%
\addcontentsline{toc}{chapter}%
{\protect\numberline{}\@chapapp\hspace{2mm}\thechapter\hspace{2mm}{#1}}%
\else
% \addcontentsline{toc}{chapter}{\MakeTextUppercase{#1}}%
\addcontentsline{toc}{chapter}{{#1}}%
\fi
\chaptermark{#1}%
\addtocontents{lof}{\protect\addvspace{0\p@}}%
\addtocontents{lot}{\protect\addvspace{0\p@}}%
\if@twocolumn
\@topnewpage[\@makechapterhead{#2}]%
\else
\@makechapterhead{#2}%
\@afterheading
\fi}
\renewcommand*\l@chapter[2]{%
\ifnum \c@tocdepth >\m@ne
\addpenalty{-\@highpenalty}%
\vskip 1.0em \@plus\p@
\setlength\@tempdima{1.5em}%
\begingroup
\parindent \z@ \rightskip \@pnumwidth
\parfillskip -\@pnumwidth
\leavevmode \normalfont
\advance\leftskip\@tempdima
\hskip -\leftskip
#1\nobreak
\leaders\hbox{$\m@th
\mkern \@dotsep mu\hbox{.}\mkern \@dotsep
mu$}\hfill%
\nobreak\hb@xt@\@pnumwidth{\hss #2}\par
\penalty\@highpenalty
\endgroup
\fi}
\makeatother
\begin{document}
\tableofcontents
\chapter{one longer title}
\chapter{two}
\chapter{three}
\appendix
\chapter{This needs to be right too}
\end{document}
答案1
我认为发生的情况是这样的。
定义中的这一行\@chapter
写入了命令的关键参数,该命令最终以as\contentsline
结尾.toc
{\protect\numberline{\@chapapp\hspace{2mm}\thechapter}\hspace{1.5cm}{#1}}
例如,当它读取文件时.toc
,LaTeX 看到的是
\contentsline {chapter}{\numberline {Chapter\hspace {2mm}1}\hspace {2.5cm}{one longer title}}{3}%
但是,这并没有让我们了解故事的结局,因为我们需要理解\numberline
。它将它的参数(此处{Chapter\hspace{2mm}1}
)打印在一个框中。那个框有多大?稍微令人惊讶的答案是,它和\@tempdima
调用时的临时变量一样大。(如果您\numberline
在主要的 LaTeX 来源中搜索,您可以找到它:texdoc sourc2e
在这些情况下是您的好朋友。)
因此,盒子的大小实际上是由 的定义中的这一行给出的\l@chapter
,特别是这一行:
\setlength\@tempdima{2.5em}%
现在我们可以理解这个问题了。本例中的方框刚好够容纳“第 A 章”,但不足以容纳“附录 A”。方框后添加的 1.5 厘米的巨大空间在一定程度上掩盖了这一点。但请记住,LaTeX 在方框后添加了空格盒子而不是内容:如果它们超出了盒子的范围,就会被忽略。所以它看起来像这样。
因此,我们需要做的是调整各种命令,以使其正确。我们能摆弄盒子后面的空间。但在我看来,这里正确的做法是删除盒子后面添加的所有空间,并使盒子足够大以容纳两个都“附录 A”和“第 1 章”。因此我们最终得到如下结果:
\addcontentsline{toc}{chapter}%
{\protect\numberline{\@chapapp~\thechapter}{#1}}%
在\@chapter
和
\setlength\@tempdima{2.2cm}%
在\l@chapter
。那(至少运行两次后,让我们的更改有时间渗透到文件中.toc
...对于粗心的人来说又是一个小陷阱!)
答案2
\numberline
确实如此\hbox to <calculated dimen>{<text>\hss}
。如果您不想在目录中对齐标题的左边缘,也许您不需要它:
{\@chapapp\hspace{2mm}\thechapter\hspace{5mm}{#1}}%