选 article,LaTeX 递给你的是美国 letter 纸;选 scrartcl,出来的则是 A4。这一处默认值的错位,正是替代类存在理由的可见一端——KOMA-Script 与 memoir,标准类不再够用时人们转投的两大家族。KOMA-Script 的起点在 1990 年代初:Frank Neukam 读过 Jan Tschichold 论书籍设计之后,认为标准文档样式还不够好,动手写了一套面向欧洲与德国排版的样式;Markus Kohm 把它按 LaTeX2ε 重做,于 1994 年 7 月 7 日以 KOMA-Script 之名发布。memoir 则出自完全不同的直觉:把与设计有关的宏包整个吸收进一个可配置的类里。本页要讲的是:二者各自为何而生、哪些旋钮真正有用,以及什么时候换过去才值得。
为什么要替换 article、report、book
原因只有一个:标准类几乎没有官方认可的设计修改入口。 article / report / book 成熟可靠,但一旦想改边距、标题或页眉页脚,就得靠 \makeatletter 修改内部命令,或者叠上 geometry、fancyhdr、titlesec、tocloft。纸张就是一个明显症状:KOMA-Script 手册特意写明,KOMA-Script 默认使用纵向 A4,这与默认使用美国 letter 纸的标准类形成对比。标准类本身请见其专属页面。
KOMA-Script 与 memoir 都正面回应这一不满,但方式不同。KOMA-Script 是 一组替代类加一套配置机制:正文写法照旧,通过选项和专用命令改动设计。memoir 是 单体的书籍类:页面布局、页眉、章标题、目录都在类内部完成,而不依赖外部宏包。这个差别会直接反映在二者与辅助宏包的相处方式上,后面就会看到。
KOMA-Script 的替代类 — scrartcl / scrreprt / scrbook
KOMA-Script 是由 Markus Kohm 维护的一组 LaTeX2ε 类和宏包(TeX Live 2024 附带的版本为 3.41,日期 2023-07-07),主要围绕标准类的直接替代构成。scrartcl 对应 article,scrreprt 对应 report,scrbook 对应 book,信函另有专用的 scrlttr2。正文写法(\section、\chapter)基本与标准类相同,但默认排版更精致,配置入口也大幅开放。因此迁移的第一步,就是把 \documentclass{article} 改成 \documentclass{scrartcl},先确认在不动其他任何东西的情况下仍能编译通过。
| KOMA 类 | 替代的标准类 | 用途 |
|---|---|---|
scrartcl | article | 论文和通用的中短篇文档 |
scrreprt | report | 带有章的报告和学位论文 |
scrbook | book | 以双面印刷为前提的书籍 |
scrlttr2 | letter | 信函(可定义多套信笺和版式) |
传入设置有两种方式:作为类选项写进 \documentclass[...]{scrartcl},或在加载之后用 \KOMAoptions{...} 修改。KOMA-Script 的设计使得大多数选项在类加载之后仍可更改,\KOMAoptions 可以一次接受逗号分隔的多个 option=value。只有当某一个选项需要同时给多个值时,才用单数形式的 \KOMAoption{option}{val1,val2}。这种“事后仍可更改”的性质,正是下面版心重新计算得以成立的关键。
计算版心 — DIV 与 BCOR
在 KOMA-Script 里,边距不是直接用 mm 指定的。位于页面设计核心的 typearea 宏包会 把页面在横向和纵向各分成若干条带(strip),再由比例推导出正文块与边距。这是把 Jan Tschichold 推广的古典版面构成——边距比例与纸张比例相呼应——机械化的结果:你决定的是「怎么分割这张纸」,而不是「留几毫米」。使用 KOMA 类时 typearea 会自动加载,所以不要自己写 \usepackage{typearea}。
决定分割数的是 DIV=。按手册的说明,DIV=factor 指定构成版心时页面在横向和纵向被分成多少条带。关键在于 factor 越大,正文块越大、边距越小,也就是每页能容纳更多文字。取值为大于 4 的整数。A4 的默认值随正文字号变化:10pt 为 8,11pt 为 10,12pt 为 12。若想按字体自动计算,用 DIV=calc;若想接近 Tschichold 等人论述过的中世纪写本版面构成,用 DIV=classic。
另一个旋钮是 BCOR=(binding correction,装订修正 / 订口余量)。把装订时被卷进书脊而看不见的宽度给它,这部分会先从版心计算中扣除,输出时再加回内侧(左)边距。数值可用 TeX 理解的任意单位,如 BCOR=10mm。二者并非彼此独立:通过 \KOMAoptions 改动 DIV 或 BCOR 时,版心与边距会一并重新计算——这正是用 geometry 直接覆盖数值所做不到的。
\documentclass[DIV=12,BCOR=10mm]{scrartcl}
% DIV=12 wider text block (same divisor as the A4/12pt default)
% BCOR=10mm reserve 10mm of gutter for the binding
\usepackage[T1]{fontenc}
\usepackage{microtype}
\title{A Short Report}
\author{Ada Lovelace}
\begin{document}
\maketitle
\section{Introduction}
KOMA-Script keeps the body markup of article
while giving you DIV and BCOR for the page layout.
\end{document}如果字体宏包是后来才加载的,这里有个陷阱。把 DIV=calc 写作类选项时,版面会按 加载你的字体之前的标准字体 定下来——KOMA 类自己会加载 typearea,等到你用 \usepackage{...} 换字体时,计算早就完成了。换过字体之后,在导言区调用 \KOMAoptions{DIV=last}(或 DIV=current),就会按新字体重新计算。
重组元素字体与标题
KOMA-Script 允许为标题、图注等文档的每个「元素(element)」集中设置字体。\setkomafont{element}{commands} 会整体替换该元素的字体定义,\addtokomafont{element}{commands} 只是在现有定义上追加(\usekomafont{element} 把当前字体切换为该元素的字体)。传入的 commands 应限于 \sffamily、\bfseries、\Large 这类 只改变字体属性 的命令,并且都要在导言区声明。若混入 \centering 之类的排版命令,每次使用该元素时它都会在意想不到的地方触发。
若要重组章节命令本身的体裁——前后空白、字体、编号的呈现方式——就用 \RedeclareSectionCommand[attributes]{name}。这是官方入口,用逗号分隔的 key=value 重新定义现有 \section 或 \chapter 的属性。页眉页脚推荐配合 KOMA 类使用 scrlayer-scrpage,其 \lehead、\cohead、\rohead 可分别填入「左 / 中 / 右」×「偶数 / 奇数页」的各个位置。书眉本身的思路见页眉页脚那一页。
为什么 KOMA 会对 fancyhdr 发警告,却对 geometry 沉默
把面向标准类的辅助宏包直接叠上来,会与 KOMA-Script 自己的设置接口相撞。对 fancyhdr,类会在日志里明说:Class scrartcl Warning: Usage of package 'fancyhdr' together with a KOMA-Script class is not recommended. 接着它推荐 scrlayer 或 scrlayer-scrpage,并列出理由——一旦用上 fancyhdr,headsepline、footsepline 之类的选项,以及用 \setkomafont、\addtokomafont 设置页面样式元素的做法,都需要人工干预才能奏效。
可是加上 geometry 时,KOMA-Script 却一声不吭。在 \documentclass{scrartcl} 之后写 \usepackage[margin=2cm]{geometry},文档照样编译通过,而 typearea 算出的版心被悄悄覆盖。不报警的那一种反而更危险。 因此在 KOMA 类下想改边距时,先看 DIV 和 BCOR 能否解决;只有在它们确实不够时才用 geometry,并且要清楚自己已经放弃了 typearea 的计算。同理,titlesec 与 \RedeclareSectionCommand 的职责重叠,tocloft 与 KOMA 自己的目录选项重叠。
memoir — 把宏包整个吞下的书籍类
memoir 由 Peter Wilson 于 2001 年发布,自 2013 年起由 Lars Madsen 维护(TeX Live 2024 附带的版本为 v3.8.2,日期 2024-01-26,自称为「可配置的 book / report / article 类」)。它并不是加载标准 book 再加以扩展——memoir.cls 中根本没有出现 \LoadClass——而是作为 替代 book 和 report 的独立类 写成的。它的特点是吸收得多:按手册所述,类本身提供与 crop、fancyhdr、geometry、sidecap、subfigure、titlesec 相似的功能,并内置了相当于 setspace 的行距控制(命令名不同)。此外它还会自动加载 array、dcolumn、delarray、tabularx、booktabs、nameref、shortvrb 等。
为什么会做成这样?接手维护的 Lars Madsen 在手册开篇亲自解释过:2001 年时,要在年度发行之外更新一个宏包只能靠手工,CTAN 甚至不要求宏包附带手册。因此把若干宏包的功能嵌进类里、并把用法统一写进这一本手册,是合理的做法。如今情况已变,他正在 反向拆解这些嵌入——例如 2023 年夏天,他把 booktabs 从「嵌入」改为「加载」。从 3.8 版起,memoir 要求 2021/06/01 之后发布的 LaTeX 内核,若过旧则直接中止编译,好让用户注意到而不是忽略。
页面布局由专用命令组装。\setlrmarginsandblock{spine}{edge}{ratio} 设置左右(书脊侧 spine 与外口侧 edge)边距,\setulmarginsandblock{upper}{lower}{ratio} 设置上下边距;页面宽度保持固定,正文块由此推导。第三个参数是比例,想交给系统计算的值可以写 *。这里是 memoir 最大的陷阱:这些声明本身什么也不会做。 只有在它们之后调用 \checkandfixthelayout,布局才会生效(该命令内部先用 \checkthelayout 检查,再用 \fixthelayout 落实)。「值都写了可版面没变」的求助,多半就是少了这一行。
章标题的体裁用 \chapterstyle{style} 切换,它的用法与 \pagestyle 相同:设置后续章标题的样式。TeX Live 2024 附带的 memoir.cls 里用 \makechapterstyle 定义了大约三十种样式——default(熟悉的 book 风格)、section(编号与标题排在一行)、hangnum(章号悬挂到边距)、companion(The LaTeX Companion 的样子),以及 bringhurst、madsen、komalike 等一看名字就知道出处的样式。想自制时可用 \makechapterstyle{name}{definition} 添加。memoir 在书籍设计上受欢迎,很大程度上正是因为这一点:可以先从三十种现成设计里挑。
\documentclass[11pt,a4paper,twoside]{memoir}
% page layout -- nothing takes effect until \checkandfixthelayout
\setlrmarginsandblock{30mm}{25mm}{*} % spine, fore-edge
\setulmarginsandblock{30mm}{35mm}{*} % upper, lower
\checkandfixthelayout
\chapterstyle{hangnum}
\begin{document}
\chapter{Beginnings}
memoir bundles page layout, headers and chapter styles
into one configurable book class.
\end{document}KOMA-Script 与 memoir,选哪一个
判断的关键在于:这份文档是否需要一套自成一体的设计。如果是论文、报告这类 从标准类自然升一级 的场合,希望有精致的默认排版和 DIV/BCOR 带来的清晰版面控制,就选 KOMA-Script。如果要 把一本书细节都设计到位,那么布局、书眉、章样式、目录都能在类内完成的 memoir 更合适。二者设计思想正面不同,不要混用,每份文档只选一个。而换过去真正划算的时机,是 设计改动会不断发生,而不是只改一次。若只是想把边距收窄一厘米,给标准类加个 geometry 反而更快。另外,如果要做的是幻灯片,那就是另一回事了:那属于另一系统的 beamer 类。
日文文档该用什么
以日文为主体的文档,既不要用 KOMA-Script 也不要用 memoir,而应使用 专为日文排版设计的类。行距、禁则处理、和文与西文之间的间距属于专用类的职责范围,KOMA-Script 和 memoir 的设计思想并不覆盖到这一层。可选的有两条路线。jsarticle / jsbook(jsclasses)声明了 \NeedsTeXFormat{pLaTeX2e},因此需要 pLaTeX 系列的格式,其 LuaLaTeX 版本是 ltjsarticle / ltjsbook。另一条是 jlreq,它实现了 W3C 的《日文排版需求(JLReq)》,可在标准 LaTeX2ε 上运行。二者各有专页可看。
从标准类迁移的步骤
迁移现有稿件时唯一的诀窍是 不要一次性重做全部外观。先只改类名——article 改为 scrartcl,book 改为 memoir——确认正文原封不动也能编译。若此时就失败,原因不在设计,而在你留下的辅助宏包。通过之后,再按边距 → 书眉 → 标题 → 目录的顺序逐项设置,每一步都对比 PDF。只要守住下面四点,迁移通常都能平静收场。
- KOMA-Script — 伸手去拿
geometry之前,先看DIV和BCOR能否解决;书眉请用scrlayer-scrpage,不要用fancyhdr。 - memoir — 布局声明的最后一定要放
\checkandfixthelayout。少了它,声明会被忽略。 - 二者共通 — 不要把
titlesec、fancyhdr、tocloft这类面向标准类的辅助宏包直接叠上;类本身就有承担同样职责的入口。 - 日文稿件 — 不要把西文的设计假设套到日文正文上;先考虑 jsclasses 或 jlreq。
% Keep every design knob in one place, with a reason next to it
\KOMAoptions{DIV=12,BCOR=8mm} % 12pt-like text block, 8mm gutter
% \RedeclareSectionCommand[beforeskip=-2ex]{section}
% For memoir, set every layout knob BEFORE the check
% \setlrmarginsandblock{30mm}{25mm}{*}
% \setulmarginsandblock{30mm}{35mm}{*}
% \checkandfixthelayout最后再说一个不起眼却很管用的习惯。用 KOMA-Script 或 memoir 写稿时,你会一边写正文一边反复试边距和标题。把这些调整从正文里挪开,集中到导言区的小区块中——「页面设计」「标题」「书眉」——并用一行注释写明为什么取这个值。等出版社或学会日后要求特定尺寸时,你原本要花在「找是哪一行在起作用」上的时间就全省下来了。