LaTeX 源文件是在普通正文中嵌入命令而成的。命令、空白和注释遵循少数规则;一开始掌握这些规则,就能避免长期遇到的小意外。为什么写 \LaTeX is 会吃掉空格?为什么按两次 Enter 会开始新段落?本页把这些机制集中说明。
文本与命令
源文件的大部分是 正文文本,也就是会按原样排版的普通字符。写 Hello,输出就是 Hello。相对地,命令(command) 是给排版程序的指示,例如换行、标题、字体变更,并且总是以 反斜杠 \ 开头(在某些日文环境中可能显示为日元符号 ¥)。\LaTeX 表示徽标,\newpage 表示分页;它们都不会作为字面文本输出。
反斜杠后面的命令名称为 控制序列(control sequence),分为两类。控制词(control word) 是 \ 后面只跟 英文字母(A–Z, a–z) 的形式;控制符号(control symbol) 是 \ 后面跟 一个非字母字符 的形式。因此 \section、\LaTeX、\newpage 是控制词,而 \$、\%、\&、\ (反斜杠加空格)是控制符号。两者不仅名称结束方式不同,对紧随其后的空白的处理也不同(见下一节)。
为什么需要区分?控制词的名称会在遇到第一个非字母处自动结束,所以写成 \LaTeXlogo 时,会被读作一个名为 \LaTeXlogo 的单个(未定义)命令。若想在 \LaTeX 处结束名称,必须在后面接一个非字母:空格、符号或 {}。控制符号正好只有一个字符,因此没有这个问题:\$5 会清楚地读作美元符号后跟 5。
控制词会吞掉后面的空白
这是最大的陷阱。控制词后面紧跟的所有空白(空格、制表符、换行)都会被丢弃。 它们只用于分隔名称,不会在输出中产生空格。因此写 \LaTeX is great 时,\LaTeX 与 is 之间的空格会消失,输出会连成“LaTeXis great”。
有三种常用修正。(1) 放 空花括号:\LaTeX{} is,{} 结束命令名,普通空格得以保留。(2) 使用 控制空格:\LaTeX\ is,\ (反斜杠后跟空格)强制产生一个普通词间空格。(3) 用花括号包住命令:{\LaTeX} is。三者的结果都是“LaTeX is”。不确定时用 {} 最稳妥;无论下一个字符是空格还是其他非字母,它都能正确工作。
% 制御語の直後の空白は消える / The space after a control word vanishes:
\LaTeX is great % → LaTeXis great (まちがい / wrong)
% 直し方 / The fixes — all give “LaTeX is great”:
\LaTeX{} is great
\LaTeX\ is great
{\LaTeX} is great相反,控制符号不会吞掉后面的空白;\$ 后面的空白会保留为普通词间空格。控制空格 \ 不只用于命令之后,也用于 缩写句点 后面,例如 Prof.\ Smith 或 et al.\ (1993)。LaTeX 默认会在句末句点后加稍宽的空白,\ 告诉它“这里不是句末”,从而保持词间距一致。
参数与花括号分组
许多命令带 参数,参数分两类:花括号 { } 包住必选参数,方括号 [ ] 包住可选参数(选项)。例如 \section{Introduction} 中的 {Introduction} 是必需的标题文字;\documentclass[12pt]{article} 中 [12pt] 是选项,{article} 是必需的类名。通常形式是 \command[options]{required}。
花括号 { } 还有第二个作用:分组,也就是限制声明的作用范围。改变字体或字号的 声明式命令,如 \bfseries(粗体)、\itshape(斜体)、\large(变大)等,不带参数,而是影响“从这里开始”的所有内容。把它们包在花括号中,效果就被限制在 该分组内部:{\bfseries bold} normal 只会让“bold”变粗,遇到右花括号 } 后恢复原设置。
\section{はじめに} % 必須引数 / mandatory argument
\documentclass[12pt]{article} % [オプション]{必須} / [optional]{required}
{\bfseries 太字になる} ここは普通 % {} で効果を閉じ込める / braces limit the scope
{\bfseries bold here} back to normal分组内外相互独立,因此视觉上的修改不会泄漏到意料之外的范围。这与环境(\begin{...}...\end{...})划定范围的思想相同:一对 \begin–\end 也会形成一个分组。环境会在单独页面中详细说明。
空格、换行与空行
空白有一套特殊规则,会把源码的外观与输出的阅读效果分开。首先,连续的空白(空格或制表符)无论有多少个,都会合并成一个词间空格;单词之间放一个空格还是十个空格,输出相同。其次,源码中的单个换行只当作一个空格处理。无论你在源码中哪里换行,最终换行位置都由 LaTeX 决定,因此可以按便于阅读的宽度折行。
那么如何开始新段落?答案是 空行:留出一行空白,就表示段落分隔。连续两个或更多空行与一个空行效果相同,都是一次段落分隔。反过来说,仅在源码中换行并不会开始新段落。关于换行和段落分隔的更细控制(例如用 \\ 强制换行),会在换行与段落页面中说明。
これらの 余分な空白は 1 つにまとめられ、
この改行も空白 1 つになります。
空行をはさむと、ここから新しい段落が始まります。有时你需要把词间空格精确放在意图所在的位置。典型例子是 连结空格 ~,它是 不可换行空格,用于不希望空格两侧被分到不同行的地方,例如 Fig.~\ref{fig:1}、Chapter~12、Donald~E. Knuth。它的宽度与普通词间空格相同,但这里不能断行。前面提到的 控制空格 \ 会强制一个普通宽度空格;在数学模式中,\,(细空格 thin space,宽度为 3/18 quad) 可用于微调间距。
注释
百分号 % 会开始一条延续到 该行行尾 的注释,编译时会被完全忽略。它不会出现在输出中,因此可用于在源码中留下备忘,或临时禁用(注释掉)命令。注释不仅延伸到行尾,还会吞掉该行末尾的换行(以及尾随空白)。这一点常成为有用的小技巧。
请记住,源码中的换行会变成一个空格。如果想把一个很长的词在源码中折成多行,又不想在断点处引入多余空格,就在行尾放 %:换行会消失,下一行会无空格地接上。把命令拆到多行书写时,同样可以用这个技巧防止混入不需要的空格。
これは行末コメント % ここから行末まで(と改行)が無視される / ignored to end of line
超長い%
単語 % → 「超長い単語」 % で改行を消してつなぐ / % joins the lines, no space
割引率は 100\% です。 % 文字としての % は \% と書く / a literal percent is \%注意,% 本身是特殊字符,因此 要输出字面上的百分号,应写成 \%(\% 是控制符号,所以不会吞掉后面的空白)。特殊字符的完整列表整理在特殊字符页面。
如果要一次禁用多行,而不是每行前都加 %,有两种方法。可以用 verbatim 包(或 comment 包)提供的 comment 环境 包住整个块:\begin{comment} … \end{comment};也可以用 TeX 条件分支 \iffalse … \fi 包住。后一种不需要额外宏包,可以一次性注释掉整个块。
\usepackage{verbatim} % プリアンブルで / in the preamble
\begin{comment}
このブロックは丸ごと無視される。
This whole block is ignored.
\end{comment}
\iffalse
下書きのコードもパッケージ無しで一括コメントアウト。
Draft code, commented out with no package needed.
\fi第一份稿件中养成的习惯
学习语法,与其死记每条规则,不如养成不易出错的写法。控制词后面接字母时用 {} 分隔;把有意义的单位包在 {...} 中;长设置不要塞进一行,而是配合注释拆成易读的几行。仅这三点,就能大幅减少初学时的困扰:空格消失、参数拿错、弄不清设置作用到哪里。
% 命令名の後ろに英字が続くなら {} で区切る
\LaTeX{} users write source, then compile it.
% 長い設定は意味ごとに分け、行末コメントで不要な空白を消す
\newcommand{\courseTitle}{%
Advanced Topics in \LaTeX%
}注释很有用,但在实际工作中,也不要让提交用正文的大块废稿长期以注释形式留在工作文件里。想比较的旧稿交给 Git 等历史工具保存,让当前 .tex 只保留“现在要排版的内容”。这样错误行号会与真实稿件对应,截止前调试会更快。
阅读出错源码的顺序
出现错误时,不要从头重读整个文件,而要按照 LaTeX 的语法单位检查源码。先在报错行稍前的位置查看:控制词名称是否吞掉了后面的字母,必选参数 {...} 与可选参数 [...] 的数量是否平衡。然后检查 %:行尾注释是否删掉了需要的空格,或者在本应输出字面百分号的地方是否忘了写 \%。
| 症状 | 首先怀疑 | 修正方法 |
|---|---|---|
run-together | 徽标或命令后面的词粘在一起 | 用 {} 分隔,如 \LaTeX{} users |
wrong-argument | 标题或命令的范围延伸过远 | 让对应的 { 与 } 包住同一个语义单位 |
comment-gap | 源码换行处空格消失或出现 | 有意区分行尾 % 与普通换行 |