狡兔百窟

兔子草的个人主页

同人本$\LaTeX$排版教程

本文为准备制作书籍类同人本的玩家撰写。

最低配置:一个浏览器。

推荐配置:一个电脑上的浏览器。


考虑了等宽文字与不等宽文字(通常就是中英文)掺杂的情况。有少量场景与操作系统有关,暂只包括Windows下的处理方案。

推荐新手使用在线工具,因此文中不包含$\LaTeX$安装等内容。如果需要在本地运行的话,这部分教程网上已经很多,可以自行寻找。

我创立了一个模板,欢迎直接下载使用。如果本文或者本模板对你出本有帮助,你感谢我一句也挺好的。

本教程包含一些高投入低回报的内容,标注了“(进阶)”的字样。

$\LaTeX$的优点

一般我们看到讲$\LaTeX$的文章,总难免骂两句这东西磨磨唧唧的渲染、乱七八糟的规范和屎山一样的包。正因如此,无数人试图取代$\LaTeX$,但它目前依然是唯一可靠的学术类排版工具,也是世界上最流行的排版系统之一,这足以证明它的独特价值。

这份价值在于,外行人想要排出一个“能看的印刷品”,$\LaTeX$是最快也最简单的解决方案。

简单易上手

Overleaf是$\LaTeX$的在线IDE,全网页端,只需注册一个账号就可免费使用。使用时,在工作区左侧先点击目录(Menu),将编译引擎换成XeLaTeXLuaLaTeX,才可正常处理中文。拼写检查系统不支持中文,建议关掉,不然中文全篇都是拼写警告。

截止到写这篇文档时,Overleaf为免费用户提供20秒的编译时间,不放图绝对够用了。(编译一个370页,20万字的本大概需要10秒)。

不过,如果想插入较多较大的图片的话,Overleaf无能为力,还是需要自己安装TeXLive1,在本地进行工作。

我的模板传到了Overleaf上,但是公开模板需要等待审核检查,等通过了我会在这里放出链接。

纯粹的排版工具

目前的DIY出本教程里面,排版这一步都是用InDesign。但InDesign本质上是版式设计软件,面向市场是杂志、画册、报纸等类型。目标情景是一页上要分若干区,有的区填字、有的区放图,设计者主要研究这些区域如何分配面积、如何摆放、如何提升信息传达率、如何保持美观。

那么问题来了,你真的需要这些功能吗?还是说,其实你需要的只是一个“能把我想印的那点东西漂亮又简单地打包成印刷用pdf”的工具呢?

$\LaTeX$是一个简单粗暴的排版软件。格式越简单、越统一,用它来做就越容易。

排个书、插个图、把一页页画好的漫画封装成指定纸张大小的pdf……放在设计业内属于绝对的轻度需求,而$\TeX$就是为这些轻度需求而生的。它的目的不是把二十页纸排出花来,而是让八百页的文档看源文件就知道格式不会出错。

创作与排版的分离

$\LaTeX$里,创作和排版天然分离,十分契合同人创作的规律。

出同人本,无一例外是拿着内容补格式。同人文的传播载体总是朴实无华的txt,偶有文画双修的大佬,也基本都是图文分离式发放。这样的创作基础天然就适配$\LaTeX$。

$\LaTeX$的使用步骤分为两步,先用文本编辑器撰写工作文件,再用引擎编译出结果pdf。在已有内容的情况下,只需要给内容文件增加简单的标记(基本也就是各级标题,有些作者会有脚注尾注,最多再有加粗斜体),通过简单的代码结构设计实现文档内容与格式的解耦,就能令工作空间简化且专注,只需关注排版的各项参数。

它有一点尤为可贵:手持一份十万字的文稿,正常人的直觉就是把它一次排完,然后对着pdf挑问题,一个点一个点修。而排版工具里,只有$\LaTeX$在一排几百页的时候不会挑你的机能。它只会慢,绝不会崩。

编辑与渲染的分离

排版的本质是把文档变成一堆矢量图。这个步骤中最本质的是编辑(设定格式即转化规则),而最耗时的是渲染。

作为一个没有图形化操作界面的排版工具,$\LaTeX$渲染时可以把所有资源全部用在“得到pdf”这一件事上,效率极高。如果你嫌Windows还是太慢,可以装一个WSL,再提一波生产力。

默认细节极佳

如果找一些专业的中文排版攻略读(比如中文排版需求中文排版网格系统的五大迷思),那么就会意识到,文字排版这件事其实非常细碎繁杂,需要关注的细节极多。

由于开源的特性,$\LaTeX$内有着大量前人造好的轮子,可以覆盖排版时应当处理的普适性专业细节,极大地节约工作成本。用户只需要进行自己的个性化即可。对于中文,最显著的案例就是标点压缩和字距。

这些细碎的设定,在$\LaTeX$的ctex包中默认就会满足。不需要自己进行任何选择或调整ctex包默认就提供最美观的排版。(破折号略有些问题,我在后文里附了解决方案)

字母类文字排版时会遇到的关键问题是,一行文字几乎不可能在换行处恰好断开。$\TeX$对此的默认处理方案可谓是视觉上最美观的。Knuth-Plass算法通过断字和拉伸,使得一段文本每行左右两侧都能对齐,且肉眼基本无法看出每行空格宽度的区别。

正因有如此基础,$\LaTeX$处理混合文本时的便捷程度天下无双。

一句忠告

$\LaTeX$是非常容易催生强迫症的,千万不要追求完美。谨记,你的时间其实也是成本。

排版参数

小说

版式设计是为了优化信息的传达。对于小说,最重要的信息永远是故事本身,即文字内容。因此,没有必要太深入地研究版面设计。但完全不管也不行,“易读性”和“可读性”是必须要考虑的。

易读性即Legibility,对每个基础单元(中文的字、英文的单词)的识别程度,更多地指向字体。可读性即Readability,即阅读体验的舒适性。在排版中,可读性代表一段文本的阅读容易度,主要指向基础单元的排布方式,例如字距、行高。

这都是排印学里非常根本的课题。有太多的人已经研究过了,我们可以直接使用现成的结论:

行高:中文的行高一般至少是字高的1.5~1.8倍,具体数值受字体和字号的双重影响。如果行高不足,汉字等高的特性会使得行与行之间空隙不清晰,降低阅读流畅性。

行数:翻页的频次主要是行数决定的,这个数极大地影响阅读体验。对于A5大小的纸张,可以以25为参照,每页行数小于等于25时,阅读体验比较休闲,反之行数越多,越接近于专业性强的书籍,阅读体验越严肃。实际使用中,23~27行适用于小说类文章排版。

单行字数:A5这个纸张大小还没有充分利用人眼的视野空间,因此单行字数只受限于字体大小和文字区域的宽度,不需要考虑人眼阅读能力而额外分栏。通常的书籍是每行28~30个字,实际体验上,26~32都是可接受的。


具体选择什么样的参数,建议按自己的需求来决定。决定一个本子气质的是单页信息量(可以简单用行数*单行字数来量化)。同字号下,单页信息量越大,阅读体验越严肃;越小体验越活泼。比方说,一行18个字,2倍行高就可以轻松打造移动端的阅读体验。

但请注意,排版越疏松,本子越厚本子越厚,成本越高。印厂算钱的时候只看页数,不看油墨密度,页数越多就越贵。并且,对于字数较多的本,不紧凑一点真的会印成砖头的。

一个更直观的算法:每页行数*每行字数得到理论每页字数,是一页纸理论上能印的字数,但实际上不可能印满(出版物上标注的字数是版面字数,约等于理论字数乘页数,所以给人的感觉很注水)。理论值乘上0.6~0.65才是实际上的平均每页字数。整个本的字数除以平均每页字数可以得到大约的正文页数(排版增加的留白已经考虑在内)。最通用的80g纸,厚度是0.11毫米。

所以用总字数/每页行数/每行字数/11.364就可以得到一个大约的厚度(单位为毫米)。

全网格化(进阶)

在正式出版物中,还有其他强迫症发作的进阶规则。

  1. 行宽是整数个字的宽

    即一排汉字能将一行恰好排满,提升每页纸上的网格感。

  2. 标题所占高度是整数个行的高

    使得不同页面格式中,正文都能实现跨页行对齐。

这些规则本质上都是令阅读体验更接近于排字印刷时代,但是到了现代,出版社也不是一定遵守这些规矩,姑且看看,了解一下即可。除非有很强的强迫症,不然不需要应用。


了解了以上内容后,就让我们进入正题,开始使用$\LaTeX$进行排版。

文本导入

注意,$\LaTeX$最好使用纯ASCII字符作为文件名和路径名,否则编译时可能出现乱码。(仅限编译记录,不影响正常生成文档)

格式转换

对于已标记好格式的文本(包括但不限于.docx,.md,.rtf,.epub),可用各种免费网页工具或pandoc转化为.tex,然后手动检查。注意,转化会完全继承原文档的格式,导言区的内容大部分是冗余的,清掉即可。

中文和外语标点存在一定的Unicode码重叠,自动转化工具通常会将标点按外语机制转化,并用外语字体进行渲染。

其中,单引号必须手动调整。转化机制不区分单引号的正反,一律将行首的单引号自动转化为`(一个英文反引号),其他单引号转化为'(一个英文单引号),因此会出现中文引号不配对的情况。在.tex文件中按原文换回中文单引号即可解决问题。

其他标点的外语化仅会影响外语字体,看不顺眼的话,全文替换换回来即可。

标点 中文写法 外语写法
省略号 …… \ldots\ldots,其后可能有space(一个空格)或{}(一组大括号)
左引号 ``(两个反引号)
右引号 ''(两个单引号)
破折号 —— ------(六个键盘上的减号)
$\LaTeX$中一个减号代表连字符(hyphen),两个代表连接号/减号(en dash),三个代表破折号(em dash)

破折号有点复杂,见后文规定标点宽度(如破折号)

另外,自动化转换工具可能会将斜体转为\emph{斜体内容}\emph意为强调(emphasis),并不完全等同于斜体,见正文

$\LaTeX$正文语法入门

对于txt文件,需要手动写一下格式。$\LaTeX$内容写作语法复杂度只在公式上,普通文本只比txt复杂一点点。如果嫌我写得太抽象了,在Overleaf上找点模板玩玩即可理解。

文件结构

$\LaTeX$文件分导言区和正文区。导言区用于编写预设,正文区用于放置文档内容。

% 导言区
% 想立刻看编译效果的话,增加下面这行
% \documentclass{ctexbook}
\begin{document}
    % 正文区
\end{document}

$\TeX$会先按顺序加载导言区的内容,前文的定义将影响后文,后文可以覆盖前文。导言区全部加载后开始逐行制作文档,正文区的命令在$\TeX$处理到所在位置时起效。

正文

正文分段需要使用两个回车(即空一行),连用额外的回车视作无效。

可以通过加一个空白段落的方式空一段,如下。

上一节最后一行

% 方案一,空白符
~\
% 方案二,空白盒
\mbox{}
% 方案三,空
\null

下一节第一行

单个回车在排版时会视作空格。

\\在不换段的情况下换行。

加粗方法:\textbf{加粗内容}

斜体方法:\textit{斜体内容}

强调方法:\emph{强调内容},默认使用斜体进行强调,如果强调中再强调一次,则会把二次强调的内容换回正体。

特殊字符

如下特殊字符在$\LaTeX$中有特殊意义,在正文中使用时不能直接写

百分号(%),$\LaTeX$将其视作注释标志,在正文中使用时请用\%

反斜杠(\,又叫转义符),用处多种多样,在正文中使用时请用\textbackslash

大括号({}),默认按分割标记理解。在正文中使用时,请用\textbraceleft\textbraceright

波浪号(~),默认按硬空格(不可在此处换行)理解。在正文中使用时,请用\textasciitilde

标题

各级标题的名称见后文各级标题

有序标题的标记方法是\级别{标题内容}。序号标记会自动处理,不用写进正文文档区。

无序标题的标记方法是\级别*{标题内容}。不含序号标记,不会参与索引建立。


好了,你入门了。

建立文档

文档类型和主字号

文档类型通常在文件的第一行定义。

\documentclass[10pt]{book}

$\LaTeX$原生有着articlebookreport三种文档类别。三种类别的主要区别在默认层深和排版方式上,虽然排版之后肯定要自己改,但为了直观,本教程推荐使用book类。

book类默认支持三种正文字号10,11,12pt。三种字号可读性都属不错,不建议更大或者更小。如果一定想用其他的,可以使用extbook类文档,支持8,9,10,11,12,14,17,20pt的正文字号。

具体选择时,可以用“磅数÷2.845=毫米数”来计算文字大小。也可参考word,word中的五号字是10.5磅,小四则是12磅。

中文处理:ctex

$\LaTeX$中使用中文时需要的内容集成在了ctex包里,需要XeLaTeX或LuaLaTeX引擎才能编译。使用方法为

% 方案一
% 在建立文档时指定使用ctex,Z代指文档类型
\documentclass{ctexZ}

% 方案二
% 建立文档后引入包
\documentclass{Z}
\usepackage{ctex}

方案一相当于建立中文文档,方案二相当于在英文文档里使用中文。方案一自动将所有预设词翻译为了中文,更加便捷;方案二在细节上更加通用。例如,按方案一生成的目录中,标题内“第x章”“第x部分”等字样需要用\ctexset命令来调整;而方案二可以用更加基础(i.e.与其他包兼容性更好)的方式对这些地方进行自定义。

ctex的文档类别除了10,11,12pt外,还支持word款的两种正文字号,配置方法如下

% 正文五号字
\documentclass[zihao=5]{ctexbook}
% 正文小四号字
\documentclass[zihao=-4]{ctexbook}

字号命令使用

字号

在文档字号不同时,各个字号命令对应的字号如上图。

字号命令一次使用对后文全部生效,局部使用时,应用{}将对应区域括起,其中包含字号命令和改变字号的内容。

此外,可以用\fontsize命令手动定义文字大小,如下。

\fontsize{字号}{所占高度}

纸张布局

一般来说,同人文本的尺寸是A5左右。标准A5是148*210mm,实际中印厂的尺寸不一定能到这里,通常会更窄一些。但我个人还是建议按标准尺寸来做设计,外边距适当留一些余量(5~8mm即可)。

geometry是处理布局的包,参数极多,这里只介绍少量常用内容,有其他需求建议阅读文档。

纸面布局

注意水平方向left, rightinner, outer这两组是二选一的关系。双页印刷应当使用inner, outer这组参数,能根据页面单双自动调整文字区域位置。

% 引入包
\usepackage{geometry}
\geometry{
    % A5纸张标准宽高
    paperwidth=148mm,
    paperheight=210mm,
    % 天头,文字区到纸张上沿的距离
    top=17mm,
    % 地脚,文字区到纸张下沿的距离
    bottom=23mm,
    % 切口,文字区到纸张被翻开一侧的距离
    outer=13mm,
    % 订口,文字区到纸张被装订一侧的距离
    inner=21mm,
    % 文字区和页眉下沿之间的空白
    headsep=7mm,
    % % 页眉的高度,一般不需要这行
    % headheight=6mm,
    % 文字区和页脚下沿之间的空白
    footskip=12mm,
}

规定版式时,水平竖直方向各三个参数即可,最后一个会自动计算。约束了纸张和版心大小后,内外只定1个就可以了。

\geometry命令会决定纸张的大小,这点不可修改。边距等版式数值可以在文档内部用\newgeometry命令进行修改,如

\begin{document}
    % ...
    % 新的边距会从当前页起效
    \newgeometry{left=30mm,right=30mm,top=20mm,bottom=20mm}
    % ...
    % 将边距重置为\geometry命令中设置的
    \restoregeometry
    % ...
\end{document}

出血

上述讲解的A5纸张所得到的是效果图,印刷时需要为印厂提供有3mm出血的版本。增加出血很简单,只需要将paperwidth, paperheight各增加6mm每一处设置的top, bottom, inner, outer, left, right各增加3mm即可。textwidthtextheight两个参数不用改变。

在正文排版没有bug的情况下,这样的修改可以在效果图四周都增加3mm的白边,同缩放比例中心对齐检阅时,文字位置完全不变。如果修改后有页面发生了移动,那么请在该页的写法上寻找问题。

各级标题

book类可以使用所有种类的标题,直观地说,可以理解为一本大部头学术书籍能涵盖的级别。对于小说,不建议使用超过两级的标题,只选用part+chapterchapter+section即可。

具体效果如下:

层深 标题 含义 效果 中短篇集用处 长篇用处
-1 \part 标题新起一张纸,并独占 在文有明显分类,每类不止一篇时,用于分类 每部
0 \chapter 标题新起一张纸,标题下可以有内容 每篇文,标题下可以插入一些独立信息(如summary)占满一页,或直接接正文 每章
1 \section 标题与上文同页 篇内分章的话,作为一章的标题 每节
2 \subsection - 标题与上文同页 看着用 看着用
3 \subsubsection - 标题与上文同页 看着用 看着用

part会重置一部分前文的格式定义,可以通过把命令写进part宏的方式提升复用性。

% 重载part宏
\let\origpart\part
\renewcommand*{\part}[2][]{
    \ifx\\#1\\
    \origpart{#2}
    \else
    \origpart[#1]{#2}
    \fi
    % 写这里就行
}

标题格式

对于文内标题,使用titlesec包内的命令来配置格式。

对于标题格式,用\titleformat命令来配置。

% 参数
\titleformat{命令}[形式]{格式}{标题序号}{间距}{前命令}[后命令]
% 示例
\titleformat{\chapter}{\huge\chapterfont}{\thechapter}{1em}{\thispagestyle{empty}}

对于标题与上下文的间距,使用\titlespacing命令。

% 参数
% 注:左间距的相对点是这一行文字的起始位置,即段首缩进后的
\titlespacing*{命令}{左间距}{上间距}{下间距}[右间距]
% 示例
\titlespacing{\chapter}{0em}{.5\baselineskip}{2\baselineskip}

标题上的编号默认为1.1.1类,即子级编号会带上上级,用以下命令来去除子级的上级编号。

\counterwithout{子级别}{亲级别}

字体设定

字体最好在排细节之前确定。不同字体文件的细节不同,换字体有可能导致文档的换行和换页发生改变,哪怕纯中文文档也是如此。

字体入门

字体类别

字体可以简单分为有衬线(Serif)和无衬线(Sans Serif,或简称为Sans)两类。衬线指笔画边角处的装饰,例如宋体是典型的衬线字体,而黑体是典型的无衬线字体。

纸张上,有衬线的字体易读性更佳,一般用于正文中;无衬线字体更加醒目,可以用于封面或勒口。

等宽字体(mono)指所有字母和符号都占据同样宽度的字体。通常说的“方块字文字”基本是等宽的,标点有可能不等宽。对字母文字而言,等宽字体的易读性并不太好,应用场景很有限。除了故意模仿打字机的文字质感外,只有编程为了竖对齐使用等宽字体。

字体风格

一个字体名是一个系列,其中往往有多个风格,最重要的是各种字重和斜体。

字重:描述一个笔画有多粗。

从轻到重(从细到粗)分别有:thin,extra light,light,regular (normal),medium,semi bold,bold,heavy (black)。一个字体必然有字重关键词,留空时会自动使用regular。原则上的加粗行为就是字重从regular变成bold。如果一个字体没有bold字重,部分软件在加粗时会自动用算法生成一种伪粗体,典型如word。

斜体:Italic,严格上来说应该叫意大利体。字母文字排版时产生的风格化方案,中文其实没有斜体,承担类似功能的是楷体或仿宋。

不是所有字体都有意大利体,很多时候我们看到的也是算法计算的伪意大利体。方案是简单将字符拉斜一些,不涉及意大利体中常见的字形变化。这种伪意大利体其实才该叫斜体(Slanted)。但由于Italic风格本身的舶来性,加之Slanted几乎没什么专门的用处,大家已经习惯将Italic称作斜体,因此我后文也沿用这种通俗的误称。

字符集和编码表

字符集指字符本身;编码表指字符字形和字符代码的一一映射表。通常来说,一套字符标准是包含字符集和编码表的。本章中仅介绍字体,因此只讨论字体对字符集的覆盖率,而不讨论编码(计算机在可以在兼容的编码表中做转换,在现代排版中基本不构成问题)。

以下是一些常用的字符集。

字符集名称 内容
ASCII 基础字符集,可见部分为美式键盘上能直接输入的字符。
此处的美式是与英式、法式、俄式等区分,中国能买到的键盘一般就是美式的。
GB2312 中文基础字符集,含6763个汉字字符。兼容ASCII
GBK 汉字扩展集,含21886个汉字字符。兼容GB2312
GB18030 中文编码字符集,含87887个汉字字符,兼容GBK
Unicode 国际字符表,基本含一切能用的字符和emoji,常用标准utf8兼容ASCII

ctex中的字体

ctex包默认根据当前操作系统选择字体配置,策略如下

ctex预设包

ctex包内有若干套预设好的字体配置,可在导入时使用[fontset=X]选择,X为包名,详见下表。

包名(X 使用字体 版权
adobe Adobe公司的四款中文字体 付费商用
Fandol Fandol中文字体 GPL+FE协议开源:放入文档中可以随意使用✅
基于此字体改编、修改等所有再创作的字体产品,均必须同样继承GPL+FE协议开源
founder 方正公司的中文字体 书宋/黑体/楷体/仿宋四种为免费商用✅
原则上需要申请一份书面授权书
mac macOS系统下的字体 印刷时存在侵权问题
macnew ElCapitan或之后的多字重华文字体和苹方字体 见上
macold Yosemite或之前的华文字体。 见上
ubuntu 思源宋体、思源黑体和$\TeX$发行版自带的文鼎楷体 免费商用✅
windows 中易字体和微软雅黑字体 付费商用

TeXLive自带字库中包含Fandol系列,各平台均可[fontset=fandol]加载全套Fandol字体配置,简单达到跨平台统一。但是它只含GB2312内的字符,可能会出现缺字。如果出现这种问题的话,还是只能自行配置字体。

常用字体获取

外语字体可在1001 Fonts上挑选。我推荐EB Garamond 12,该字体实现了拉丁、希腊、西里尔字母的全覆盖,用起来很省心。

思源系列开源,这是官方地址:思源宋体思源黑体

方正系列官网需要登录等操作,这里给出第三方下载链接:方正书宋方正楷体方正仿宋方正黑体。不确定网站可靠性,链接或许会失效。请注意,在找方正字体文件时请一定找GBK后缀(书宋字体文件8.87M),而非GB2312或简体后缀(书宋字体文件2.63M),预防字体缺字。

字体名称

$\LaTeX$配置字体时,名称可以使用字体专属名和文件名(含不含后缀均可)。

字体专属名是嵌入字体文件内的,也是操作系统识别字体时所用的标识,以此配置较为稳定,可读性也较高。

字体文件名是可以随意修改的,只建议在使用专属名出错或文件名容易检查时使用。

在Windows中,简单的查找字体专属名称方法是运行fc-list命令,其覆盖范围与$\LaTeX$能检索的范围一致。

可以用系统命令fc-list >> fonts.txt生成一个字体表文件,包括系统上的可用字体。增加:lang-zh参数可以指定过滤筛选中文字体。注意一些字体虽然使用时是中文,但其字体文件会被识别为日文或韩文,不会出现在结果中。确定英文系列名时,可以用fc-list | Select-String "系列名"来筛选字体列表。中文名可能会是乱码,建议只用英文名进行此项操作。

得出的结果中包含字体名,这里使用开源字体Vollkorn系列举例,fc-list | Select-String "Vollkorn"得到的结果如下

C:/Windows/fonts/Vollkorn-Medium.otf: Vollkorn,Vollkorn Medium:style=Medium,Regular
C:/Windows/fonts/Vollkorn-Italic.otf: Vollkorn:style=Italic
C:/Windows/fonts/Vollkorn-Bold.otf: Vollkorn:style=Bold
C:/Windows/fonts/Vollkorn-MediumItalic.otf: Vollkorn,Vollkorn Medium:style=Medium Italic,Italic
C:/Windows/fonts/Vollkorn-BoldItalic.otf: Vollkorn:style=Bold Italic
C:/Windows/fonts/Vollkorn-Regular.otf: Vollkorn:style=Regular
C:/Windows/fonts/Vollkorn-SemiboldItalic.otf: Vollkorn,Vollkorn Semibold:style=Semibold Italic,Italic
C:/Windows/fonts/Vollkorn-Semibold.otf: Vollkorn,Vollkorn Semibold:style=Semibold,Regular

其中*.otf::style之间的Vollkorn即为字体在系统里的名称。对于字体的特殊风格,可以直接以字体名 风格作为字体名加载,如Vollkorn Semibold Italic。切记区分大小写,有的字体里会是SemiBold,有的是Semibold

注:一些字体名中含有-,在打印时会增加转义符显示为\-,使用这些字体时输入-即可。

另外,也可以使用FontDrop!网站解析单个字体文件,获得字体名。解析样例字体EBGaramondSC12-Regular.otf时结果如下。

You see EB Garamond SC

Name: EB Garamond SmallCaps 12 Regular. Style name: 12 Regular. Version 0.016
© Created by Georg Duffner with FontForge 2.0 (http://fontforge.sf.net)

License: Copyright 2010-2013, Georg A. Duffner (<http://www.georgduffner.at/ebgaramond|g.duffner@gmail.com>), 2013 Siva Kalyan This Font Software 

其中You see后的是字体系列名,而Name. Style name之间的EB Garamond SmallCaps 12 Regular即为字体本身在系统里的名称(对于风格字体,即为指定时使用的名称)。

字体配置

这里介绍两种字体配置方法。路径法适用于在多个工作环境中使用同一项目,安装法适用于在单一工作环境下维护多个项目。Overleaf仅支持路径法。

路径法

路径法增加一个[Path=路径]的可选参数,人为限制$\LaTeX$的搜索范围,设定主字体的方法如下。其中,路径使用绝对路径和(以编译文件的位置为起点的)相对路径均可,需要用代表文件夹的/或\结尾。

fontspec包命令支持使用专属名和文件名,ctex包命令似乎是不支持专属名的。

主目录
│   main.tex
├───fonts
│       myfont.otf
└───...

在这样的文件结构下,使用以下写法设定字体。

\setmainfamily[Path=fonts/]{myfont}

文件名或路径仅使用ASCII编码覆盖的字符为宜,不要使用中文文件名或路径

安装法

安装法即为将字体安装进系统中,通过字体名称调用。$\LaTeX$可以自动检索系统路径C:\Windows\Fonts\下的字体和TeXLive安装时带的字体。如需自定义字体,安装时需要选择为所有用户安装

由于安装法的字体名检查起来较为不易,推荐使用专属名。(用Everything的话可以无视这句)

以下为设定主字体的方法。

\setmainfamily{字体名称}

配置的字体找不到?

第一步,确定字体确实安装在了C:\Windows\Fonts文件夹里。

第二步,检查代码中的拼写和fc-list命令获得的一样,特别是大小写。

第三步,用FontDrop!网站解析单个字体文件,获得字体名,和fc-list里获得的可能会不一样。

第四步,在字体专属名外面加个中括号。别问为什么,我也不懂,总而言之亲测有时候是有效的。

% 修改前
\newCJKfontfamily\xbsong{Source Han Serif SemiBold}
% 修改后
\newCJKfontfamily\xbsong{[Source Han Serif SemiBold]}

第五步,改用文件名配置。

第六步,天涯何处无芳草,字体到处都是,换一个吧。

fontspec包符字体配置

$\LaTeX$的字体配置默认是只对部分字符生效的,需要分别配置,混排时可以叠加指定。默认配置使用fontspec包,ctex包只对中日韩三语起效,与fontspec包的语法非常类似。

非CJK字符(不止为ASCII,还包括章节符$\S$和摄氏度℃等国际通用符号),是默认使用基础字体渲染的,只有fontspec包配置的字体才能起效。

% 引入包
\usepackage{fontspec}
% 设置主字体
\setmainfont{Vollkorn}

可以设置三种基础类别的字体:主字体\setmainfont\rmfamily调用;无衬线字体\setsansfont\sffamily调用;等宽字体\setmonofont\ttfamily调用。一般设个主字体就够了,其他两种字体是默认格式中使用的,自定义格式时反正也要覆盖掉。

\newfontfamily配置新的字体。

% 设置字体,并自定义字体命令\medfont
\newfontfamily\medfont{Vollkorn Medium}

$\LaTeX$默认寻找同系列的字体作为其加粗和斜体,但可以自行进行指定。

% 设置字体,并自行配置加粗和斜体
\newfontfamily\medfont{Vollkorn Medium}[BoldFont=Vollkorn Semibold, ItalicFont=Vollkorn Semibold Italic]

使用非主字体时,只需要输入配置时设定的字体名即可。与字号类似,字体命令一次使用也对后文全部生效,局部使用时,应用{}将对应区域括起,其中包含字体命令和改变字体的内容。

\begin{document}
    % 一次性使用
    \fontspec{Vollkorn medium}[...]
    % 预先设定好
    \medfont medium weight text
\end{document}

外语连字(进阶)

外语衬线字体中存在连字(ligature),通过设计优化某些字符串的显示方式来提升易读性。最经典的三个案例如下图(字体为Vollkorn)。

连字样例

$\LaTeX$默认载入一部分通用连字(OTF中tag为liga),能提升外文文本的易读性。而一些字体对连字的设计比较充分,还使用了其他的连字tag。通常类别有:clig指上下文连字(contextual),能使手写体中产生连笔;dlig指自由连字(discretionary),会使文字更花俏;hlig指历史连字(historical)能令文字看起来较为复古;rlig标记必需连字(Required),可以实现“将英语字母拼合得到其他字母”,例如ae拼合为æ。

连字配置

配置时可以添加一个[Ligatures=XXX]参数,启用一些其他tag里的连字,见上图。其中Common是默认打开的。

可以用FontDrop!这个网站来查看字体内连字。有些字体虽然设计了连字,但并没有正确标注,导致这些连字虽然存在但却无法使用。面对这种情况,可以用FontForge软件进行手动标注

ctex包字体配置

中文字符,如(中文分号),(中文书名号),均需要使用ctex包内的命令进行字体配置才能正常显示。

如果使用ctex包字库的话,字体命令已经预定义好了。主字体默认为宋体,加粗为黑体,斜体为楷体,等宽(\ttfamily)为仿宋。

\songti 宋体
\heiti 黑体
\fangsong 仿宋
\kaishu 楷书

% 只对 windows、founder 和 macnew 字库生效
\lishu 隶书
\youyuan 幼圆

如果选择自定义,首先要引入包时用[fontset=none]避免加载默认字体集,防止产生冲突。

\documentclass[fontset=none]{ctexZ}
% 或
\usepackage[fontset=none]{ctex}

字体配置的命令和fontspec包的差不多,加个CJK即可配置中文、日文、或韩文的字体,配置出的字体只会对这三种语言内的字符生效。

% 主字体
\setCJKmainfont{Source Han Serif}[BoldFont=Source Han Serif SemiBold, ItalicFont=FZKai-Z03]

% 以下是六种常用的GBK免费商用中文字体名

% 思源系列字体有Source Han和Noto两个名字,是一样的
% 不同国家和地区使用的同一汉字具有同一Unicode编码,但字形不同,用后缀区分使用情况
% 语言包后缀:J(日语),K(韩语),SC(简体中文),HK(繁体中文-香港),TW(繁体中文-台湾)
% 国家/地区后缀:JP(日本),KR(韩国),CN(中国),HK(香港地区),TW(台湾地区)
% CN通常足够使用,SC较CN覆盖范围要更高一些
\newCJKfontfamily\songti{Source Han Serif CN} % 思源宋体 CN
\newCJKfontfamily\sheiti{Source Han Sans SC} % 思源黑体

% 方正系列,GBK字符集
% 有S(简体)T(繁体)两种后缀的字体,对应的是GB2312字符集,不建议用
\newCJKfontfamily\shusong{FZShuSong-Z01}% 方正书宋
\newCJKfontfamily\fangsong{FZFangSong-Z02} % 方正仿宋
\newCJKfontfamily\heiti{FZHei-B01} % 方正黑体
\newCJKfontfamily\kaiti{FZKai-Z03} % 方正楷体

其中,方正系列四个字体都只有一个字重,而思源两个系列都具有extralight,light,regular,medium,semibold,bold,heavy七个字重,可以进行指定。所有字体中都不含斜体。

高级配置

本节介绍的高级配置最好是在阅览的过程中调整。

pdf阅览器

想看字体效果,先要有一个好使的pdf阅览器。

打印的分辨率是300dpi,而屏幕的分辨率鲜少到达这个级别,因此屏幕上预览的pdf,精度比起打印机通常是压缩了的。由于渲染机制原因,不同pdf阅览器通常有着不同的压缩效果,建议找一个使用方便,且页面模式下与放大到300dpi下效果最相似的。个人经验中,Windows端的Acrobat DC Pro在英文花体字上发生了笔划显著过细的现象,而SumatraPDF和Edge,Firefox,Chrome均未出现此问题。

一些阅览器(如SumatraPDF、Acrobat DC Pro)支持自定义屏幕分辨率,合理配置后以在屏幕上显示与实物等大的内容。屏幕分辨率根据显示器尺寸(即对角线长)、比例、勾股定理、像素数即可计算,单位dpi为dots per inch,即每英寸像素数。

SumatraPDF的配置方式为目录-设置-高级选项,在配置文件中把CustomScreenDPI = 0改为CustomScreenDPI = 屏幕分辨率。Acrobat DC Pro的配置方式为Ctrl+K打开首选项,在自定义分辨率中输入屏幕分辨率/系统缩放比例

中文

中文的可选字体其实不少(开源字体可以见此名单)。从各方面收集到的资料来看,方正系的字体适用范围最广、知名度最高,设计应该是最佳的。

实际使用时,推荐将方正书宋(书宋即完全针对书籍印刷设计的宋体)作为主字体,指定方正楷体或仿宋作为斜体,以便于在正文中标注少量字符(如引用),这样易读性较佳。

不过,方正书宋只有一个字重免费,固然技术上可以将较粗的思源宋体或方正黑体作为粗体使用,但思源系列与方正书宋字形相似又不同,夹杂使用令人不适;黑体也不适用于书写正文。如果对加粗有明确的需求,请挑一款多字重的字体(如思源宋体)作为主字体。不过,由于字形差异足够大,依然可以搭配方正字体作为斜体。

装饰性文字(脚注、页眉页脚等)建议使用方正仿宋或楷体,注意与斜体区分。

各级标题字体建议用不同字重的思源宋体来显示。

内页不推荐使用黑体。

可以用\ctexset{ziju=额外倍数}来额外改变字距,但是不建议改,属于费力不讨好。

外语

外语的免费字体很多,必然支持ASCII字符,绝大部分都支持拉丁字母及变形,一部分支持希腊和西里尔字母,选择字体时检查文本所用符号,确认字体支持即可。

有一些进阶选项,恰当使用可以提升混排效果。这里介绍几个比较实用的花招,更详细的推荐阅读fontspec包文档。

以下样例中,中文使用思源宋体Regular;英文字体均是从网站1001 Fonts下载的免费商用字体,全部使用Regular字重的默认配置。

字体对比

思源系列是全语言支持,只是需缩小一点并降低字母间距,才适用于正文混排。默认比例适合于形如“Chapter 1 节俭”这样多语言分隔的格式,或极少量穿插其他语言的大段文本。

Neuton的字母偏小。配置时可用[Scale=比例]参数放大。

EB Garamond的字母与中文相当契合,但数字采用了与英文相同的三格设计(俗称OldStyle),在数字与汉字混排时看起来会很诡异。可使用[Numbers=Lining]切换到等高数字。注意此方案起效建立在字体中含有等高数字的前提下,不是所有字体都支持。

Spectral的字距比起中文明显偏高。可使用[LetterSpace=改变值(如-3)]来降低字母间距。另,如果想要调整空格宽度,使用[WordSpace=空格宽度]参数即可。


方正系列虽然覆盖了外语的字符,但并没有做对应的设计(很多被认为是抄的),基础参数也很不合理。四种免费字体内除ASCII外的全部字符,均与中文字符等宽,不适合用于显示外语。因此极不建议将其作为fontspec包配置的字体。

页面排版

行高和段距

首先来明确几个词的含义:

行高:上一行文字底边到这一行文字底边的距离。

行距:即行间距,上一行文字底边到这一行文字顶边的距离。

段距:换段时,在行距基础上额外增加的距离。

行高

推荐使用\setspace包来调整行高。

% 定义好的命令
\singlespacing % 单倍行高
\onehalfspacing % 1.5倍行高
\doublespacing % 双倍行高

% 自定义行高
\setstretch{行高倍数} % 默认行高等同于\setstretch{1.3}

其中,定义好的三个命令以文字高度(即字号)为基础值,即,单倍行高会使得行高等同于文字高度。

但自定义行高的机制则不然。\setstrectch的基础倍数为字号的120%。对于10pt的文档字号,\setstrectch{1}会使得行高为12pt,\setstrectch{1.5}会使得行高为18pt。

这些方式都会使\baselineskip(记录行高的变量)自动跟着变化,可以以此为参数设置缩进。

段距

改变\parskip即可,默认为0pt。段距应为行高的整数倍,不然特别的丑。

\setlength{\parskip}{段距}

使用时,最好不要只给一个数,容易导致出现大量Overfull/Underfull \vbox错误,解决方法有两种。

  1. 设置段距时,给出弹性空间。不要让最短段距低于0,会使得段间空白小于行间。
  2. 使用命令允许每页下缘不齐。不推荐,在页面布局做不到行对齐时,该命令会使得整体看起来像狗啃的一样。
% 设置弹性空间
\setlength{\parskip}{段距 plus 最多加大值 minus 最多减少值}
% 下缘不对齐
\raggedbottom

缩进

identfirst包来放开首段的缩进。

\usepackage{indentfirst}

段首缩进的长度也可以调整,但不是很需要。中文文档用默认的2字宽是最合适的。

\setlength\parindent{长度}

换页

\clearpage命令可以使后续内容从新的一页上开始,\newpage则可以新起一栏(单栏模式下即为新开一页)。有浮动要素(如图片、表格)时,二者的处理机制也不同,如需要这部分功能请自行深入研究。

自动空白页

\chapter及以上级别的标题会自动新起一张纸。book类文档中默认为双页模式,右页为新纸。当上文结束在奇数页时,会产生一页空白页。不想要的话,可以在定义documentclass的时候增加一个参数openany,允许在偶数页开启新内容。

\documentclass[...,openany]{...}

相对的,如果在使用了openany参数后,希望某页在右页上开始,则可以使用\cleardoublepage命令。该命令会自动插入空白页,使后续内容从下一个右页铺开。

若希望后文在左页上开始,可以使用以下写法:

% 新起一页
\clearpage
% 如果页码为奇数
\ifodd\thepage
    % 插入一个空白页,空白页实现见后文杂七杂八-空白页一节
    \blankpage
\fi

手动空白页

一页强制插入的白纸包含若干要素,建议直接写成命令,方便使用。

\newcommand{\blankpage}{
    % 新起一页
    \newpage
    % 页面要有内容,不然会被省掉,空box,~\,\null均可
    \makebox{}
    % 由于页面内有内容,需要手动去除页眉页脚
    \thispagestyle{empty}
    % 下一页,也可用\vfill或\clearpage实现
    \newpage
}

页码更改

在文档中,可以用\setcounter来修改页码,后续页的页码和目录中的页码都会跟着改变。在目录后使用该命令,可以很简便地确定正文首页为第1页。

\setcounter{page}{本页的新页码}

如果某处存在若干页使用其他方式排版(如图文混排时的图片部分),需要将这部分页码空置预留出来,可以使用\addcounter增加页码。

\addcounter{page}{增加量}

孤字和孤行(进阶)

中文排版有一条原则叫“孤字不成行,孤行不成页”。

“孤字不成行”指,一行不能只有一个字(不含标点);“孤行不成页”指一页不能只有一行。很遗憾,这个问题是非常痛苦的“在不同丑里找平衡”大挑战,最省心美观的解法就是放弃。但如果你就不死心,我也可以给你提供一些方案。

(下文中“优雅”的标准是“一,保持内容和格式的分离”,“二,使得不同段落、不同页面的观感尽可能一致”)

手动

不优雅,但好使。

孤字:把每段最后两个字(以及标点)用\makebox{}括起来。

孤行:引入包needspace,在适当的地方加一行\needspace{高度},该代码能使此后一定高度的内容留在同一页上。

评价:后患无穷,只能用于“最终final付梓再也不改了再动我是XX”版本里。更关键的是,我只是说它能解决孤字孤行,没说它会好看。

自动

非常优雅,但很难搞。

调整单行字数和单页行数,在让排版风格完全没有瑕疵的前提下,通过调参规避孤字和孤行。

评价:可选的参数其实就那些,好消息是可以穷举,坏消息未必举得出来

半自动

还算优雅,但不咋好使,与手动或自动搭配或可减轻一些工作量。

孤字:ctex包中对于一行内能填充的空白是可规定的,默认为1\ccwd,把这个数改小一些能让标点更加紧凑,部分文本将让一行纳更多的字符,或可避免孤字的出现。支持规定为数(默认单位为\ccwd)或长度。

\ctexset{linestretch=伸展量}

ctex包中集成了CJKpunct包,可以改变标点风格,把风格改变为开明式(句末全角、句中半角),也能让部分行多容纳一点字符,或可避免孤字。

\punctstyle{kaiming}

孤行:

拉丁排版中,不希望一个多行段落在一页上只有一行。以下代码会通过调整段距的方法来解决该问题。

% 禁止在一段的正数第一二行间换页
\clubpenalty=10000
% 禁止在一段的倒数第一二行间换页
\widowpenalty=10000

放在中文排版内,它能够解决多行段最后的孤行问题。对于单行段,可能发生“前文占据了更多的垂直空间,使得更多的内容放在了尾页”这样的间接解法。

评价:便于快速体验什么叫“在不同丑里找平衡”。

引用

常见的引用基本可以分成两款。

段落格式

适用于长引用,直接插入正文。首段缩进在环境里不起效,如果需要,请在第一行文字前加入\hspace{\parindent}

引入changepage

\begin{adjustwidth}{左侧缩进量}{右侧缩进量}
    % 字体字号等配置
    % 引用内容
\end{adjustwidth}

文本框

适用于短引用,打包成文本框,作为浮动对象参与排版。

\begin{minipage}[位置]{宽度}
    % 字体字号等配置
    % 引用内容
\end{minipage}

默认支持htbp四个位置,h即当前位置(here),t即本页顶部(top),b即本页底部(bottom),p指放在一个仅有浮动对象(图和表)的页面上(page)。四个参数可多选,但优先级固定为htbp。还有一个!的参数,指忽略美学指标。

注释

注释一般是用脚注和尾注两种,视情况自行选择即可。

脚注

页底脚注以\footnote[编号]{内容}命令来添加。

\footnote[编号]{内容}

引入footnpag包可以在每页重置脚注编号。

\usepackage{footnpag}

脚注高度通常不是整行高,会拉扯当页的行宽,可以用以下代码避免

\usepackage[bottom]{footmisc}

脚注所使用的字体可以自行设定,方法如下

\usepackage{etoolbox}
\makeatletter
    \patchcmd{\@footnotetext}{\footnotesize}{指定字体和字号}{}{}
\makeatother

使用以下代码令脚注使用罗马数字

\renewcommand{\thefootnote}{\roman{footnote}}

尾注

建议使用endnotes包来管理尾注。

添加尾注使用\endnote[编号]{内容},在文章任意地方使用\theendnotes命令输出尾注。第二次使用\theendnotes会输出第一次输出后新增的尾注。

尾注标题使用以下命令进行修改。

\renewcommand{\notesname}{尾注标题}

尾注标题默认影响\leftmark(该命令的用处见页眉页脚一章),可以用以下命令规避。

\renewcommand{\enoteheading}{\section*{\notesname}\mbox{}\par\vskip-\baselineskip}

尾注编号可以用如下代码重置:

\makeatletter
    % 每章重置尾注编号,chapter可修改为其他标题级别
    \@addtoreset{endnote}{chapter}
\makeatother

使用以下代码令尾注使用罗马数字

\renewcommand{\theendnote}{\roman{endnote}}

目录

建议在决定了所有内容后,再来设计目录的格式。

\tableofcontents命令,在文档中插入目录。

目录标题

使用如下命令来调整目录页的标题内容,其格式默认与\chapter级标题相同。ctex文档类别中,目录页标题会翻译为“目录”,也可用如下命令来修改。

\renewcommand{\contentsname}{目录标题}

目录配置

用如下命令设置目录层深,层深数值见前文。

\setcounter{tocdepth}{层深}

目录格式配置包并不唯一,我使用的是titletoc,配置目录中标题格式的命令是\titlecontents

% 代码
\titlecontents{标题名}[左距离]{上方代码}
{序号格式}{无序号的标题格式}
{页码格式}[下方代码]

% 样例
\titlecontents{chapter}
[0em]
{\vspace{1em}\Large\tocchapterfont}
{\makebox[10mm][l]{\S\hspace{0.1em}\large\uppercase\expandafter{\romannumeral\thecontentslabel}}}
{}
{\hspace{4mm}\tocpagefont\large\contentspage}
[\vspace{0.5em}]

其中,无序号标题默认不出现在目录里,想要的话需要手动添加。可使用以下命令。

\addcontentsline{toc}{级别}{标题名}

目录中的标题名默认会显示在序号区和页码区之间,内容默认与正文中的标题名相同,可以不同,有些时候也需要不同。如注只能放在正文中的标题里,而不能出现在目录索引里。

\chapter[索引中的名称]{正文中的名称}

[索引中的名称]留空可以使其在目录中只有节编号,而不显示节名称。

当改变页码字体时,可能会出现\hbox underfull警告,可以用以下代码改变默认的页码宽度。

\makeatletter
    \renewcommand{\contentspage}[1][\thecontentspage]{\hb@xt@\@pnumwidth{#1\hfil}}
    \renewcommand{\@pnumwidth}{页码宽度}
\makeatother

局部目录

titletoc包支持局部目录,用法如下。

% 开始记录标题属于某个局部
\startcontents[局部名称] % 这是一个key,不要加转义符,使用时保持一致即可
% 结束记录某个局部的标题
\stopcontents[局部名称]

% 打印局部目录
\printcontents[局部名称]
{前缀} % 留空则使用主标题内的格式
{开始层级} % 局部目录的开始层级
[层深] % 局部目录的层深
{目录代码} % 该目录表头的代码,如\chapter*{\contentsname}可增加一个标题

文档内跳转

虽然是按印刷品的标准的制作,但是为了检阅方便,还是建议使用hyperref包来启用超链接跳转。这样可以从目录直达某个标题。

超链接会带来格式的变化,可以使用一条命令来避免。

% 启用超链接
\usepackage{hyperef}
% 超链接不影响格式
\hypersetup{hidelinks}

目录换页

可以在正文中手动向目录中增加换页符,确定换页位置。

\addtocontents{toc}{\protect\newpage}

页眉页脚

一般使用fancyhdr包来自定义页眉页脚。

页面风格定义

\fancypagestyle命令设计新的页面风格。

% 页面风格名为mystyle
\fancypagestyle{mystyle}{
    % 清空既有设置
    \fancyhf{}
    % 设置页眉页脚
    \fancyhead[位置]{内容}
    \fancyfoot[位置]{内容}
}

位置为[L,C,R](左中右)和[O,E](奇偶数)两个选项组成,如LE表示偶数页的左侧,C表示无论奇偶页都显示在中间。

文档自动的标记

对于book类而言,文档随着进行会自动更新两个标,以便于在页眉页脚中使用。其中\leftmark记录章标记,\rightmark记录节标记。如果想要获得部类别的标题和序号,需要自己手动记录。

标记的记录机制与目录中的相同,默认使用正文中的名称,也可专门定义索引名时。

\chapter[索引的名称]{正文中的名称}

\Xmark默认为X 序号. 索引中的标题名称,可以用重定义的方法来去除章标记中X 序号.的部分,节标记同理。

\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\renewcommand{\sectionmark}[1]{\markright{#1}}

$\LaTeX$中没有预设记录part标题的变量,可以自己设置

% 定义变量
\newcommand{\parttitle}{}

% 重载part宏
\let\origpart\part
\renewcommand*{\part}[2][]{
    \ifx\\#1\\
    \origpart{#2}
        \renewcommand*\parttitle{#2}
    \else
    \origpart[#1]{#2}
        \renewcommand*\parttitle{#1}
    \fi
}

也可以在正文中随时使用如下代码来修改左右两种标记。

\markboth{新的左标记}{新的右标记}
\markright{新的右标记}

左标记默认比右标记高级,所以不能单独定义,不想影响右标记的话填入\rightmark即可。

页面风格使用

在文档中使用\pagestyle{风格名}命令设置这一页起的风格。

使用\thispagestyle{风格名}设置当前页的风格,下一页自动还原。

fancyhdr包提供fancyplainempty几种内置风格,book类会自动引用适配不同的页面,可以用上文的定义方法直接重定义。

fancy:页眉外侧角落偶数页为\leftmark,奇数页为\rightmark,页脚中央为\pagenumber

plain:页脚中央为\pagenumber

empty:什么都没有。

问题处理

对于由于标题位置而补充的空页,其页面风格默认与前文相同,可以使用引入emptypage包,使得空页面上不显示页眉页脚。

页眉下默认有一条横线,可以用以下命令来设置横线宽度,0为去除。

\renewcommand{\headrulewidth}{宽度}

如果希望页眉页脚溢出在文字区外,可以使用以下写法:

\fancyhfoffset[位置]{溢出值} % 用H/F这组位置标记来明确是页眉还是页脚
% 单独设置页眉或页脚的溢出
\fancyheadoffset[位置]{溢出值}
\fancyfootoffset[位置]{溢出值}

图片

处理图片需要的包是graphicx。插入图片的常用代码如下。

插入图片

% 封一个figure环境,环境内的命令不影响外部
\begin{figure}[图片位置]
    % 水平居中
    \centering
    % 导入图片,文件名使用相对路径或绝对路径均可
    \includegraphics[限制参数]{文件名}
    % 设定图片标题
    \caption{图片标题}
\end{figure}

figure的意义是进行内外隔离,为插图服务。对于一些极端情况(如全文档只有图片)可以不包这一层。

graphicx图片位置默认支持htbp四个位置,h即当前位置(here),t即本页顶部(top),b即本页底部(bottom),p指放在一个仅有浮动对象(图和表)的页面上(page)。四个参数可多选,但优先级固定为htbp。还有一个的!参数,指忽略美学指标。如果额外引入float包,那么此处还可使用H作为参数,可以大概理解为“竭尽全力把它放在当前位置”。

导入图片的限制参数有很多,详见文档。最常用的是scale=放缩比例width=图片宽度height=图片高度,都是等比例放缩。

图片标题

图片标题用caption这个包来风格化,用法如下。

% 导入包
\usepackage{caption}
% 设置
\captionsetup{
    % key=value类配置,如
    font=small, % small号字体
    labelformat=empty, % 隐藏编号
}

旋转

graphics内置了一个旋转功能,使用方法如下。

\rotatebox{逆时针旋转角度(角度制)}{旋转内容}

顾名思义,就是把内容打包成一个盒子,然后转一下。

其它

规定标点宽度(如破折号)

绝大多数中文标点都能在$\LaTeX$中按标准方式渲染,但是破折号基本都不会和标准使用方法一样,等同于两个字宽。这与字体和连字均有关系,有兴趣可以阅读这篇帖子。想完美解决很复杂,但是想简单解决真的很简单。

% 直接把破折号用盒子框起来,默认居中
\makebox[2\ccwd]{——}
% rule命令画线,可以自行根据字体设计破折号的高度、粗细、长短。
\makebox[2\ccwd]{\rule[0.35em]{1.6\ccwd}{0.03em}}

使用中,可以将实现方式定义为一个命令,然后把正文中所有破折号替换为该命令,一键解决。

注:\mycommand文字会发生识别错误,应该使用{\mycommand}文字的写法。

特殊字符换字体

对于个别字符,你可能不满意它的默认字体,(例如问号)。可以用如下写法进行修改。

给它起名\mysymbol,在全文中将中文字符替换成{\mysymbol},大括号防止文字粘连。

设定命令,让\mysymbol用指定字体渲染。注意大括号需要有两层,限制字体应用范围。

\newcommand{\mysymbol}

行溢出

行溢出,即Overfull \hbox警告。一行文字无法恰当地显示在规定的行宽里。

从本质上来说,警告并不是一定要消除,因为它不影响功能的实现。但是$\LaTeX$中的警告基本可以画等号,所以排版过程中还是建议解决一下。

调整字号、行宽等基础布局数值,都可能在某些页面产生或消除该警告。

可以增加一个sloppypar域来一劳永逸,即

\begin{document}
    \begin{sloppypar}
        内容
    \end{sloppypar}
\end{document}

但这样的解决方法会导致某一行字距过大,还是影响观感。最美观的解决方法应该是直接调整文本,在确定页面参数后,通过增减这一行的几个字或标点来解决问题。不过因为只能在给自己排版时进行改动,所以大部分时候就只能接受一点点的不美观了。

纸面不充盈

Underfull \vbox警告。该警告出现是因为某页前一部分内容不足以填充页面,后一部分内容所需空间又过多,致使页面无法恰当地加载。

调整行宽、行高、段距等基础布局数值,都可能在某些页面产生或消除该警告。

解决方案为在合适的地方进行手动换页(\clearpage\newpage)。但由于这样的手动解决方式不是很优雅,所以应当在排版过程的最后进行此调整。

扉页

虽然可以选择用\maketitle命令生成一页现成的扉页,但是真的很丑。中文出版物的扉页通常是封面的黑白朴素版,内外呼应,我个人推荐按此办理。根据封面的设计来手动布局,或直接导出一页适于黑白印刷的封面pdf文件(注意出血),插入正文开头作为扉页。

\usepackage[pdfpages]
\begin{document}
\includepdf[
    pages={文档页码,以英文逗号连接},
    angle=逆时针方向旋转角度
    ]{文件名}
\end{document}

子文件

善用子文件可以便于管理,实现格式与内容的分离,以及无关内容彼此分割。

最简单的方法是用\input命令,将另一个.tex文件引入当前文件,效果相当于用该文件的全部内容替换\input这一行。

% 子文件,head.tex
\documentclass[10pt]{book}
\usepackage{hyperref}
\hypersetup{hidelinks}

% 主文件,main.tex
\input{head}

对于较厚的本,可以使用\subfiles来分割出子文档,该包可以在不影响整体编译的情况下,独立编译子文档。由于换页的位置会直接影响效果,每个子文档的内容,在主文档中都应当开始于新的一页或新的一张纸。

% 以main.tex为主文档
% 在同层级的Chapter文件夹内,创建ch1.tex为子文档

% 子文档
\documentclass[../main]{subfiles}
\begin{document}
文档内容
\end{document}

% 主文件,main.tex
\usepackage{subfiles}
\begin{document}
\subfile{Chapter/ch1}
\end{document}

对于一些在文档内使用生效的命令,如\pagestyle,需要在子文件的文档内容里和主文件引入子文件前使用,才能达到相同的渲染效果。

在子文档中,页码自动从1开始。可以手动设置,但不建议这样做,因为手动调整页码的命令在主文件内同样生效,容易产生页码不连续的问题。

subfiles包有时会出现一些bug,如果主文件和子文件渲染出来有页码之外的区别的话,大概就是原生bug造成的。如果调整不出来,可以釜底抽薪,删除开头结尾的document相关声明,改用\input引入。

更多文字装饰

ulem包提供了更多的文字装饰方法,如下。

\uline{下划线}
\uuline{下划两条线}
\uwave{下划波浪线}
\sout{删除线}
\xout{划掉内容}
\dashuline{下划虚线}
\dotuline{下划点线}

注意,ulem包会默认将\emph命令的效果替换为下划线,每强调一次,强调内容下方就会多一条线。可以在引入时规避。

\usepackage[normalem]{ulem}

色彩

一般用xcolor处理色彩。

先定义颜色。

% 颜色格式为RGB、HSB、CMYK etc
\definecolor{颜色名称}{颜色格式}{颜色参数}
% 样例
\definecolor{purple}{RGB}{189, 147, 249}

\color设置字体颜色。

\color{颜色名称}

\colorbox绘制彩色背景盒子。

\colorbox{颜色名称}{文本内容}

输入emoji

emoji分单色和多色两种,有不同字体,使用方案不同。

单色emoji

单色emoji的使用方法近似于一般文字,可以上色。

加载单色emoji字体后,用\char\symbol输入编码使用。emoji的unicode编码可以在emoji字典上查询。

典型的单色emoji字体如Symbola

% 编码前一个英文双引号为十六进制的标志
\fontspec{Symbola}{\symbol{"十六进制编码}}
\fontspec{Symbola}{\char{"十六进制编码}}

多色emoji

多色emoji使用emoji包处理。只能使用LuaLaTeX编译

典型的多色emoji字体如Twemoji

% 引入包
\usepackage{emoji}
% 设置一个普适的emoji字体
\setemojifont{多色emoji字体}

% 使用emoji
\emoji{名称}

每个emoji的名称见emoji包文档。

严格网格排版(进阶)

严格网格,能让版式像排字印刷时一样精致。

不推荐玩这个,因为哪怕pdf做得再齐,印厂也很可能给你印歪。只是如果你想要一份电子书给自己收藏的话,那它还是很酷的。

行高段距设定

下文教程将以\baselineskip(行高)作为纵向的基本单位,所以第一步是将行高调整的命令放到序言区开头。

\setstretch{行高倍数}

段距设定为行高的整倍数,不留弹性

\setlength{\parskip}{0pt}

版心规划

可以用em(单字宽度,不考虑字距)或\ccwd(单字宽度考虑字距)作为单位来定义版心的宽度(textwidth),使得每行严格形成网格。不自行调整字距的话,这两个单位是一样的。

版心高度(textheight)应为规划行数*行高-行距,$\LaTeX$是可以算数的。

% 建立长度变量
\newlength{\theight}
% 输入行数
\setlength{\theight}{期待行数\baselineskip}
% 删除一个多余的行距
\addtolength{\theight}{1em}
\addtolength{\theight}{-\baselineskip}
% 计算好后定义版式
\geometry{
    % ...
    textwidth=每行字数\ccwd,
    textheight=\theight,
    % ...
}

正文对齐

上面设完之后,纯正文的页面将不会出现任何警告。但各级标题(加上上下留白)的高度几乎不可能是行高的整数倍。

使用现成字号方案的话,由于不同主字号下,各级字号的的大小没什么关系,这里无法给出普适性的精确方案。(需要的话,建议自己算)但可以给非正文区域上下添加弹性空白。如果一页纸上只有正文和单个空白弹性的块,且正文溢出到下页的话,这个做法可以令弹性空白很精确。

{基础长度 plus 扩张长度 minus 压缩长度}

更朴实的方案是把所有非正文用盒子或minipage括起来,固定其所占高度。

\begin{minipage}[对齐标准,建议用c][所占高度]{所占宽度}
    内容
\end{minipage}

篇末谈

为什么写这篇文章?

因为我喜欢$\LaTeX$。

大约在1977年的一天,高德纳(D. E. Knuth)或许是收到了出版社寄来的可怕样书,或许是在写玩《计算机程序设计的艺术》第三卷《排序与搜索》的手稿时意识到电脑打不出这东西,总之,他深感当时的排版软件太烂了,配不上他的才华,所以选择搁置写作,给自己开发了一款高质量的排版工具。1983年6月,$\TeX$完工。1985年,Leslie Lamport给$\TeX$套了一份宏,简便易用的$\LaTeX$从此诞生。

这是$\TeX$系列的精神内核,不是因为利益,而是因为需求。因为我需要,而且我相信别人也需要。整个$\TeX$社区就是基于这样的心态所建立的,我这篇文章也是同理。

为什么不用Typst

因为Typst还是太菜了。

当然,这样说粗糙了些。具体地讲,放弃Typst有以下几个原因。

中文处理能力不足

具体地说,在几个字符范围内的处理,Typst已经把能做的都做了,但以段为单位的中文处理能力还距离出版级较为遥远。

细心的你或许一早就发现了我讲标点压缩和字距时留下的暗坑。

标点压缩:

连续的两个标点(如:“)合并挤压为1.5个字符宽

字距:

文字每行左右均顶格,恰好占满设定的行宽

那么问题来了,如果我行宽设定为24个字宽,某行的内容是兔子草灵感迸发,提笔写道:“此处应有一段广告,但,那么它应该占多少格呢?

答案是24个。虽然只看文本,这一行应为23.5个字宽,但它既然是一行,就必须是24个字宽。为了美观,左右对齐的权重要重于标点压缩的正确性。可Typst目前是渲染为23.5个字宽。

(通常这里的解法有:把连用的标点扩到2个字宽;把三处标点各压一点,挤出半个字宽,多放一个字在这行;把整行字距增大一点点,凑出半个字宽 et al.)

如果说半个字宽你还觉得影响不大的话,请注意,一段长文字必然要换行,而大部分标点不可以出现在行首,但是又要占一格。自然换行处是标点的话,Typst会从上一行抠一个字塞进下一行,使得前一行末尾出现整个字的空缺。

结果就是:随便粘几百字有对话的小说进Typst,右缘就稀烂了。如果文本是多语言夹杂的,这个问题还会更进一步放大。

格式转换路径空缺

我写文一般用markdown,当下最简单的富文本格式。而就这么轻量级的语言,目前也没有md2typ的自动转化工具。注释、图片、表格这堆东西,要我自己动手抠格式,我是真的抠不动。

功能欠缺

以下是我比较在意的几个问题:

  1. 没有尾注功能,只有脚注和引用。
  2. 加粗/斜体等格式中,如果发生字体缺失,自动用默认字体渲染,甚至不报警告
  3. 没有删除线。
  4. 无标号时,无法实现文件内跳转。
  5. 很难按左右页设置页眉页脚。

为什么不用InDesign

因为作为外行,我在研究InDesign时,感到它特别愚蠢

我无法理解各层UI目录的嵌套设计原则,出于同样的原因,我在阅读文档时也感到了极大的困扰。

我更不能接受它糟糕的多语言支持:中文UI的翻译甚至连断字(hyphenation)和连字(ligature)都分不清。

我最无法接受的是它的性能。我只放了三页文档,调格式的时候都能明显感到卡顿。甚至有几次调完格式它原地崩溃了。我的电脑配置是i5-12400F,32G双通道内存,4060ti,还配得上三页只有字的A5纸吧。

$\LaTeX$怎么念?

$\TeX$虽然长得很像英语(该符号也是用英语字母绘制),但其实是希腊词根τεχ(依次为tao,epsilon,chi)的大写ΤΕΧ,具有technology和art双义,读作“泰-赫”。

$\LaTeX$的La则是Lamport的缩写,它读作“拉-泰-赫”。这个读音和Lamport的读音没啥关系,多半只是为了继承$\TeX$反直觉的读法,故意取头两个字母,以让名字与乳胶(latex)长得很像。

补充阅读

本文旨在快速上手排版,因而跳过了大量命令解释和高级语法的内容。如果想要深度使用$\LaTeX$,仍需补课。

以下是几份我认为值得一读的参考,

LaTeX知识库是一套非常基础的文档,对于各个基本功能都进行了详细讲解。适于完整阅读,以初步了解$\LaTeX$。

lshort-zh-cn是真正意义上的$\LaTeX$介绍文档lshort的中文翻译版本。内容翔实丰富,基本覆盖了一切用户所需要知道的内容。适于想要认真使用$\LaTeX$的用户仔细阅读。

Overleaf Document是一套纯英文的进阶文档,基本涵盖了所有用得上的功能。适于比较着急的人,针对性阅读能解决自己当下问题的章节段落即可。

$\TeX$book是高德纳写的$\TeX$指南,有中文翻译。建议至少读完前言和第一章“此名有诗意”,可以更好地理解$\TeX$的功能和目的;继续阅读,则能学到很多不知道用不用得上的知识。但,我建议等$\LaTeX$不够你玩了的时候,再进行深入学习。

  1. TeXLive:$\LaTeX$的编译器,仅能通过命令行使用,建议搭配VSCodeTeXstudio等工具。