一个人在个性化他的 ToC 时遇到了问题,你建议他使用以下几行来帮助他:
\newcommand{\mychapter}[2]{
\setcounter{chapter}{#1}
\setcounter{section}{0}
\chapter*{#2}
\addcontentsline{toc}{chapter}{#2}
}
你能解释一下吗
[2]
你为什么在旁边写\mychapter
?为什么要使用标签进行编号?
的功能是什么
\addcontentline
?
我希望不会打扰您太多,我只是一个想要了解该软件的新用户。
答案1
[2]
为什么在 旁边写“ ”\mychapter
?取自
source2e.pdf
- LaTeX2e 的源文档(部分11.3 命令定义,第 23 页):\newcommand*{<\FOO>}[<i>]{<TEXT>}
用户命令定义
\FOO
为具有参数的宏i
(i
如果缺失则为 0),其定义如下<TEXT>
。如果已定义则会产生错误\FOO
。通常,命令定义为\long
(IE星号形式表示命令的首字母缩写(它可能在其参数中占用多个段落)。在星号形式中,命令未定义为\long
,并且命令的任何参数中的空行都将生成错误。因此,(和 的一般用法
\newcommand
也是\renewcommand
和\providecommand
)是在方括号内包含参数的数量。使用您的定义,\mychapter
将采用两个 (2
) 个参数。另请参阅
\newcommand
和有什么区别\newcommand*
?(超出此范围,可能更具技术性,但仍然相关,请参阅\def
和有什么区别\newcommand
?)。为什么要使用标签进行编号?
取自TeXBook(章节20 定义(也称为宏),第 198 页):
一旦你掌握了简单的宏 [...],你可能会开始想,“天哪,如果我能有一个宏,其中扩展中的一些文本是可以改变的,那不是很好吗?我希望能够将不同的东西插入到该文本的中间。”好吧,TeX 有个好消息要告诉你:控制序列可以根据参数来定义,你可以提供将替换参数的参数。
... 该符号
#1
代表宏的第一个参数,... 最多可以有九个参数#1
,#9
...\mychapter
因此,您将使用#1
and/or引用其中的参数,#2
因为宏需要两个参数。#1
表示第一个参数,#2
表示第二个参数。如果需要,请参阅如何定义接受超过 9 个参数的命令。
的功能是什么
\addcontentsline
?取自
source2e.pdf
(部分61.3 目录等,第 287 页):该
\addcontentsline{<table>}{<type>}{<entry>}
命令允许用户将他/她自己的条目添加到目录等。该命令将条目添加\contentsline{<type>}{<entry>}{<page>}
到.<table>
文件。该宏是作为 的一个应用程序实现的
\addtocontents
。因此在文件中
\addcontentsline{toc}{chapter}{#2}
插入一个条目,其中是的第二个参数。该条目是在页面实际发送出去时确定的,因为这是 TeX 异步发送例程和页面引用的本质。\contentsline{chapter}{#2}{<page>}
.toc
#2
\mychapter
<page>
您会注意到,
<type>
目录中的不同 s 具有不同的格式。章节看起来不同于节,节又不同于(或至少可能不同于)小节,等等。这些差异要求提供带有<type>
宏\addcontentsline
的 ,就像 中所做的那样\mychapter
。
答案2
你为什么在旁边写“[2]”
\mychapter
因为宏被定义为接受 2 个参数。这些参数显然是 (a) 预期的章节编号和 (b) 章节标题。
为什么使用标签进行编号
因为这是引用宏参数的 LaTeX/TeX 语法:#1
是第一个参数,#2
是第二个参数,等等。
的作用是什么
\addcontentline
出于某种原因,宏的创建者\mychapter
(我发誓,不是我!)选择使用\chapter*
而不是\chapter
排版章节标题。在主 LaTeX 文档类中,\chapter*
(a) 创建未编号的章节,(b) 不不是自动在目录中创建一个条目。\addcontentsline
宏是一种手动方式,用于将该信息插入到创建目录信息的文件中。