摘要
这一课开启本课程的第三单元,即文档结构单元。它说明本单元的用途:从上一单元排版精良的文本,走向一份具有自身架构的长文档,其各个部分自动编号、列入目录、彼此引用,并分布在多个文件中;介绍本单元的五节课以及贯穿其中的线索,从文档类与页面一直到自己的导言区;说明哪些内容假定已从前面各单元掌握;回顾学术文档的各种形式从何而来;提出本单元要解决的问题:一份手写引用和编号的文档,一经修改便开始说谎;并说明这一架构对物理学学位论文和历史学学位论文同样适用。
学习目标
- 描述本单元内容的顺序,并说明每节课为下一节课提供了什么。
- 认出本单元假定已从前面各单元掌握的内容,必要时加以复习。
- 用一个例子说明为什么内部引用不能手写。
- 在不同学科的学术文体中认出本单元所教排版的结构。
入门测验
在学习本单元之前,先测一测自己的起点是有益的。这项测验是自我测评:不计分,唯一的目的是为学习指引方向。前两道题复习本单元假定已从前面各单元掌握的内容;后面十道题按顺序每两道对应本单元的一节课。从未排过长文档的人不必指望答对:每个答案,无论对错,都会解释要点,并指出讲解这一要点的那节课。同样的技能会在单元末尾的总结课中再次测量。
开始本单元之前,先测一测你的起点。这是一次简短的自我测评:不计分,结果只保存在你的浏览器中。
第 1 题来自前面的单元一份文档第一次编译后,用
\ref写的引用显示为两个问号,日志要求再编译一次。这是怎么回事?这种情况可能发生,但那样的话,再编译一次之后,未定义引用的警告仍会存在;而这里日志要求的正是再编译一遍。\ref和\label属于 LaTeX 内核,不需要任何宏包。删除它无济于事:下一遍会重新写出它,引用仍要再等一遍。引擎只把源文件读一遍;它在一遍中记入.aux文件的内容,要到下一遍开始时才读取。因此引用和目录至少需要编译两遍。复习: 编译与排错
第 2 题来自前面的单元一篇随笔用
\zuopin{…}标记作品名,导言区中定义为\newcommand{\zuopin}[1]{《#1》},而不是在每一处手写书名号。这样做有什么好处?今天的结果差不多;好处出现在规范改变、需要把书名与其他标记区分开的时候。速度没有明显变化;好处在于维护,而不在于性能。定义中没有任何东西把它们送进目录;它只决定外观。命令指明功能,即作品名,其定义决定外观。这就是逻辑标记,本单元将借助自己的导言区把它变成一种方法。复习: 有意义的格式
第 3 题一名学生用
\documentclass{article}写学位论文,并用\chapter{…}划分正文。编译时会发生什么?文档类不会转换它不认识的层级:这个命令在其中根本不存在。层级取决于文档类;正因为如此,选择文档类是结构上的第一个决定。未知命令会引发错误;引擎不会默默忽略它。每个文档类定义自己的层级:report和book有\chapter;article从\section开始。分章的学位论文要用具有章的文档类来写。复习: 文档类与页面
第 4 题一所大学要求在 A4 纸上留 2.5 厘米的页边距。设定页边距的恰当方法是什么?
a4paper选择纸张大小;页边距由文档类按照自己的比例决定,而不是按照大学的规定。这并不改变页边距,而只是移动文本;而且在断行产生的行首,\hspace会消失;此外,这是在正文中使用视觉标记。字号不会改变页面的页边距。geometry 根据少数几个尺寸计算页面的全部尺寸,因此只需声明一次,各项尺寸彼此协调。复习: 文档类与页面
第 5 题在
article类的文档中,于\tableofcontents之前写了\setcounter{tocdepth}{1}。目录显示什么?这个数字是最大深度,而不是单一层级:第 1 级及以上的层级进入目录,也就是节。目录只在第一次编译时为空,这是多遍处理的缘故;tocdepth不会清空目录。编号由另一个计数器secnumdepth控制;tocdepth只决定哪些内容进入目录。tocdepth规定进入目录的最深层级:在article中,节是第 1 级,小节是第 2 级。小节在正文中仍有编号,只是从目录中消失。复习: 章节、目录与附录
第 6 题在
article类的文档中,在命令\appendix之后写了两个\section。它们如何编号?\appendix存在的意义正是改变编号;没有它,附录不过是多出来的几节。附录有编号,用字母表示,并进入目录。在基本文档类中,附录的编号使用大写字母。\appendix重新开始节的编号,并改为大写字母;在report和book中,它对章做同样的事。复习: 章节、目录与附录
第 7 题一位作者在
\section{方法}的前一行写了\label{sec:methods},这一节是第 2 节。\ref{sec:methods}印出什么编号?在源文件中靠得近并不够:起作用的是先后顺序。写在前面的标签看不到第 2 节的编号。标签存在并被记录下来;第二遍之后它会印出一个编号,只是不是想要的那个。不会报错;标签写在标题之后,既不写在里面,也不写在前面。\label不知道后面会出现什么:它保存的是它之前最后分配的编号,这里是第 1 节的编号。所以标签要紧接在\section{…}之后写。复习: 交叉引用
第 8 题加载 hyperref 宏包后,文档中会有什么变化?
编号不变;hyperref 把它们变成链接。仍然需要多遍编译:链接依靠的是辅助文件中的同一批数据。这些名称由语言设置决定(babel 或 ctex);hyperref 不碰它们。hyperref 既不改变编号,也不改变文字:它添加的是导航。所以它在导言区靠近末尾的位置加载,排在它要修改其行为的几乎所有宏包之后。复习: 交叉引用
第 9 题在学位论文的主文件中,
\include{chapter1}与\input{chapter1}有什么区别?二者在分页、辅助文件以及能否只编译部分内容上都不同。\input接受任何文件,无论在导言区还是在正文中。两者都不修改文件:它们都在编译时读取文件。\include是为章设计的:它另起一页,为每个部分保留一个自己的辅助文件,并允许选择;\input适用于任何片段,甚至在段落中间或导言区中也可以。复习: 长文档
第 10 题一篇学位论文的导言区含有
\includeonly{chapter3},正文用\include包含五章。如果这篇论文以前已经完整编译过,这次编译会得到什么?\includeonly决定排哪些章;其余各章不出现在 PDF 中。只有删去其他\include才会如此;使用\includeonly时,编号保持不变。其他文件仍在原处,只是没有被排版。对每个被排除的章,LaTeX 读取它最近一次编译留下的辅助文件,因此编号仍是完整文档的编号。复习: 长文档
第 11 题导言区中有
\newcommand{\emph}[1]{\textbf{#1}}。会发生什么?那是\renewcommand的效果;\newcommand拒绝重新定义。一个名称只指一个命令;同名的两个命令不能并存。定义在导言区中执行,被拒绝的定义就是一个错误。这种保护防止无意中替换掉 LaTeX 或某个宏包的命令。如果确实要重新定义,就用\renewcommand,同时清楚会失去什么。复习: 宏与自己的导言区
第 12 题导言区中有
\newcommand{\liang}[2]{#1~#2},\liang{5}{km}印出什么?#1是写下的第一个参数,即 5,它在定义中排在前面。波浪号是保留字符:在定义中它起不可断空格的作用,不会被印出。\newcommand最多接受九个参数,编号从#1到#9。[2]声明两个参数,#1和#2按顺序接收它们:数值和单位,由一个波浪号连接。这个命令指明功能,并保证永远不会忘记波浪号。复习: 宏与自己的导言区
正在加载内容…
已完成
登录账户以保存您的进度