标志 (\TeX 等)

LaTeX 的 logo 命令 \TeX,其定义只有一行:T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@。把它和 Knuth 写在 plain.tex 里的原型摆在一起,LaTeX 版只在末尾多了一个 \@——就这一个记号,让「用 TeX 排成。下一句」这样的句末空白宽了 1.11pt。logo 命令不是装饰,而是这类细小判断的集合。本页将看看 \TeX\LaTeX\LaTeXe 究竟是怎样排出来的,要显示 \XeTeX\BibTeX 需要什么,以及在三个会让 logo 出问题的地方——标题、PDF 书签和 .bib 文件——应该怎么写,并附上实际排版得到的输出。

logo 是怎样排成的:kern、下沉的 E 与升高的 A

\TeX 是把「T」「下沉的 E」「X」用负 kern 拉近而成的,看数字就能明白设计意图。T 与 E 之间是 −0.1667em(正好 1/6 em,与数学中的细空格等量),E 与 X 之间是 −0.125em(1/8 em),E 下沉 0.5ex。有趣之处在于:如此收紧,成品却没有变窄。在 10pt 的 Computer Modern 下量宽度,直接打出的「TeX」是 18.33334pt,而 \TeX18.6108pt——反而略。因为 E 下沉后,相邻字形的咬合方式变了;由此可知 \TeX 是一条「造形状」的命令,而非「省宽度」的命令。\LaTeX 则确实收紧了:25.66368pt 对比打出的「LaTeX」的 29.58337pt,窄了约 13%。

latex.ltx
% The three logos LaTeX itself defines (latex.ltx, lines 7648-7661).
\DeclareRobustCommand\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@}
\DeclareRobustCommand{\LaTeX}{L\kern-.36em%
        {\sbox\z@ T%
         \vbox to\ht\z@{\hbox{...\fontsize\sf@size\z@ ... A}\vss}}%
        \kern-.15em\TeX}
\DeclareRobustCommand{\LaTeXe}{\mbox{\m@th
  \if b\expandafter\@car\f@series\@nil\boldmath\fi
  \LaTeX\kern.15em2$_{\textstyle\varepsilon}$}}

\LaTeX 是同一思路的延伸:在 \TeX 之前放一个 升高的小 A 组成「La」,再接上 TeX logo。那个 A 并不是独立字符,而是把脚注尺寸(\sf@size)的 A 顶端对齐地放进一个恰好与 T 等高的 \vbox 中——换言之,指令的意思是「让 A 的顶端与 T 的顶端对齐」。L 与 A 之间那个深达 −0.36em 的 kern,造就了那份独特的咬合。\LaTeXe 则在其后再排一个 2作为数学下标的 \varepsilon;细看 $_{\textstyle\varepsilon}$ 就能发现 ε 来自数学模式,因此它的字形随数学字体而非正文字体变化。而当 logo 出现在粗体标题中会跟着变粗,是因为 \LaTeXe 会检查字体系列并切换到 \boldmath

LaTeX 标准只带三个 logo:XeTeX 与 BibTeX 不在其中

原生 LaTeX 只定义了三个 logo 命令:\TeX\LaTeX\LaTeXe\XeTeX\LuaTeX\pdfTeX\BibTeX\ConTeXt不在其中。直接书写会得到 ! Undefined control sequence.,因此必须加载宏包。不过有两组例外值得记住。加载数学文档通常都会加载的 amsmath 后,就能使用 \AmS,写 \AmS-\LaTeX 便得到「AMS-LaTeX」字标。至于 METAFONT 与 METAPOST,标准做法是使用 mflogo 宏包的 \MF\MP——它们由专用的 logo 字体排出,别的途径都得不到正确的字形。

拿不定主意就用 hologo 决定性的理由不是「收得多」,而是它在 PDF 书签里不会坏掉——后面的小节将实测这一点。hologo(TeX Live 2024 随附 v1.15,日期 2021-11-16)并不增加大量单独命令,而是把一切收拢为一个把 logo 名称作为参数的命令,如 \hologo{XeTeX}。宏包自己的描述行称它是「带书签支持的 logo 集」,这正是关键。它认识约五十个名称,因此 \hologo{pdfTeX}\hologo{LuaTeX}\hologo{BibTeX}\hologo{ConTeXt}\hologo{KOMAScript}\hologo{LaTeX3}\hologo{biber} 都可用。若要在句首把首字母大写,使用 \Hologo{...}\Hologo{pdfLaTeX} 会排成「PdfLaTeX」。

需要注意的是传入未知名称会直接失败。日文圈常用的 \hologo{pTeX}\hologo{pLaTeX},在 TeX Live 2024 随附的 hologo 中并未登记,会得到 ! Package hologo Error: Unknown logo 这样的错误。当正文中出现 pTeX、upTeX、pLaTeX、upLaTeX 时,实际的做法是别再去找 logo 命令,直接把字母打出来。metalogo(v0.12,2010 年)走的是相反路线:它把 \XeTeX\XeLaTeX\LuaTeX\LuaLaTeX 定义为独立命令,作为交换,可用 \setlogokern{Te}{...}\setlogodrop{...} 按字母对逐一调整 kern 与下沉量。若你需要让 logo 重新贴合当前所用字体——比如在 XeLaTeX 下使用系统字体,觉得 \LaTeX 里 A 的位置不对——这是唯一趁手的工具。另外,hologo 只对外提供 \hologo\Hologo,因此与 metalogo 同时加载并不会发生命令名冲突(已在 TeX Live 2024 的 pdfLaTeX 与 XeLaTeX 下验证)。即便如此,为保持表记统一,还是统一使用其中一个为好

latex
\usepackage{hologo}    % \hologo{...} and \Hologo{...}
% \usepackage{metalogo} % \XeTeX, \LuaTeX + \setlogokern for fine tuning
% \usepackage{mflogo}   % \MF and \MP

\hologo{pdfTeX}, \hologo{XeTeX} and \hologo{LuaTeX} succeed \hologo{TeX}.
\hologo{BibTeX} builds the bibliography; \hologo{ConTeXt} is a rival format.
\Hologo{pdfLaTeX} starts a sentence with a capital.
% \hologo{pTeX} is NOT defined: "Unknown logo" error. Type pTeX instead.
命令输出所需宏包
\TeXTeX(E 下沉 0.5ex)LaTeX 标准(无需宏包)
\LaTeXLaTeX(小 A 顶端与 T 对齐)LaTeX 标准(无需宏包)
\LaTeXeLaTeX2ε(ε 是数学下标,随数学字体变化)LaTeX 标准(无需宏包)
\AmSAMS;写 \AmS-\LaTeX 得到 AMS-LaTeXamsmath / amstex
\hologo{XeTeX}XeTeX(反向的 E);在书签中同样安全hologo
\hologo{BibTeX}BibTeX;另有 \hologo{biber}\hologo{BibTeX8}hologo
\hologo{ConTeXt}ConTeXt;\hologo{LuaTeX}\hologo{pdfTeX}\hologo{KOMAScript} 同理可用hologo
\XeTeXXeTeX,可用 \setlogokern 微调,但在书签中会坏掉metalogo
\LuaLaTeXLuaLaTeX;\XeLaTeX\LuaTeX 出自同一宏包metalogo
\MF / \MPMETAFONT / METAPOST,由专用 logo 字体排出mflogo

XeTeX logo 里那个反向的 E 究竟是什么做的

答案取决于引擎。hologo 与 metalogo 都会先问「当前字体里有没有 U+018E(拉丁大写反向 E,Ǝ)」;有就直接用这个字符,没有就用 graphicx\reflectbox 把 E 镜像过来。因此同一份源码,内里却不同。在 TeX Live 2024 上排一份只含 \hologo{XeTeX} 的文档,再用 pdftotext 从生成的 PDF 中抽取文本:用 XeLaTeX 排会得到 XƎTEX,用 pdfLaTeX 排则得到 XETEX。前者是真正的 Ǝ 作为字符存在,复制粘贴仍是 Ǝ;后者只是被左右翻转放置的 E,文本层里留下的仍是普通的 E。纸面上看着一样,检索和复制的结果却不同。

那么,若连 \reflectbox 也没有呢?hologo 不会放弃,而是按 graphicxpgfpstricks → 自带的驱动专用代码 的顺序寻找替代手段。若统统找不到,它就发出警告,说该 logo needs driver specific macros, but driver ... is not supported,然后排出一个普通的 e 继续往下走。也就是说页面上只会显示「XeTeX」,文档照样完成——正因为不会中断,这种损坏反而不容易察觉。常规的 pdfLaTeX 与 XeLaTeX 不会走到这条分支,无需担心;但若你使用的是冷门驱动而 logo 看起来异常平淡,请到日志里找这条警告。

标题、PDF 书签与 .bib:logo 会坏掉的三个地方

标题没问题,书签取决于宏包,.bib 需要留神——这就是结论。先说标题:\TeX\LaTeX\DeclareRobustCommand 定义,因此被写入目录或页眉时不会坏掉(关于移动参数出事的老故事,来自尚无这层保护的年代)。出问题的是书签。hyperref 在构造 PDF 书签字符串时,必须丢弃全部排版命令。在 TeX Live 2024 上用 metalogo 排 \section{Using \XeTeX{} today},日志里会反复出现 Package hyperref Warning: Token not allowed in a PDF string (Unicode): removing \reflectbox on input line 5.,而最终的书签写着 「Using X0.5ex0.5exE0.5exTeX today」——尺寸参数直接漏进了字符串。把同一个标题改写成 \hologo{XeTeX},则一条警告也没有,书签是 「Using XeTeX today」。因为 hologo 为每个 logo 另备了一套 PDF 字符串形式,这正是「拿不定主意就用 hologo」的理由。

.bib 文件的坏法又不一样。许多 BibTeX 样式会重新整理标题的大小写,也就是把未被花括号保护的内容机械地小写化——logo 命令也不例外。写 title = {Typesetting With \LaTeX and \TeX},交给 plain.bst 处理,生成的 .bbl 里会是 Typesetting with \latex and \tex.,下一次排版便以 ! Undefined control sequence. 中止。对策很简单:把 logo 命令用花括号包起来。写成 title = {Typesetting With {\LaTeX} and {\TeX}},它就能原样通过 .bbl。这和保护 {DNA} 之类缩写是同一个习惯。另外也请记住不该使用 logo 的地方:文件名、URL、\verb 内部、pdftitle 之类的 PDF 元数据,以及描述命令行的场合——在那里,朴素无饰的「LaTeX」才是正确的,logo 命令要么无意义,要么有害。

refs.bib
% Wrong: plain.bst lower-cases it to \latex, then LaTeX stops with
%   ! Undefined control sequence.
title = {Typesetting With \LaTeX and \TeX}

% Right: braces protect the command from BibTeX case changing
title = {Typesetting With {\LaTeX} and {\TeX}}

吞掉空格的问题:为什么「LaTeX is」会印成「LATEXis」

\LaTeX is great.,输出会是 LATEXis great.——logo 与后一个词粘在一起。(这是从 TeX Live 2024 排出的 PDF 中用 pdftotext 抽取的实际字符串。)成因与 logo 本身无关,而是 TeX 的词法规则:由字母拼成的命令,会吞掉标记名字结束的那个空格。这条规则为什么存在,属于语法基础页面的范围。补救有两种:在命令紧后放上 空花括号 {},或插入 反斜杠加空格 \ (控制空格)。两者都会让输出变成 LATEX is great.。若紧随其后的是逗号或句号,本来就没有空格可吞,因此 \LaTeX, \TeX. 直接写即可。也有人让 xspace 宏包自动补回空格,但它在某些情形下会判断失误,因此先用 {}\ 明确写出才是稳妥的习惯。

latex
% Bad: the space is eaten, giving "LATEXis great."
\LaTeX is great.
% Good: empty braces end the command name
\LaTeX{} is great.
% Good: a control space
\LaTeX\ is great.
% No space to eat before punctuation, so this needs nothing
\LaTeX, \TeX.
% In maths, step back into text mode first
$x = \text{\LaTeX}$

最后还有一点:logo 命令属于文本模式\TeX\lower\hbox 组装而成,因此直接塞进数学模式($...$)并不妥当;应先用 amsmath\text{} 切回文本,写成 $x = \text{\LaTeX}$\LaTeXe 更进一步:其定义本身被 \mbox 包裹,并在内部进入数学模式把 ε 排成下标。只要你还把 logo 命令当作「字符串」,它的行为就会让人困惑;一旦知道它是升降盒子(用户层的等价物是 \raisebox)、kern 与数学下标的组合,就能预先猜到它会在哪里出问题。