pdfTeX

pdfTeX 是 TeX 引擎,直接生成 PDF,中间没有 DVI 步骤。它是 pdflatex 实际运行的引擎,也是多年来世界上使用最广泛的 TeX 引擎。它的标志性功能是*微排版*:边距字距调整,它可以让行边缘的字符稍微突出超过文本块,以及字体扩展,它可以几乎难以察觉地拉伸或缩小字形宽度。这些是 pdfTeX 在印刷质量轴上的特殊之处。

pdfTeX 是什么

Knuth 的原始 TeX 仅发出一种名为 DVI (与设备无关)的中间格式,然后由单独的程序将其转换为 PostScript 或 PDF。 pdfTeX 从该管道中删除了一个步骤,并从 TeX 的页面构建器直接生成 PDF。该书由来自越南的 Hàn Thế Thành 于 20 世纪 90 年代末撰写,是他在捷克共和国马萨里克大学攻读博士学位时的一部分。首次公开发布于 1996 年。

需要明确的是,pdfTeX 是一个引擎,而不是一种格式。引擎是执行工作的可执行文件;格式是命令系统(LaTeX、Plain TeX)。运行 LaTeX 格式的 pdfTeX 引擎为您提供 pdfLaTeX (命令 pdflatex);运行 Plain TeX 会得到 pdftex。当你说你正在“用 pdfLaTeX 编写”时,pdfTeX 就是底层的引擎。

pdfTeX 合并 e-TeX 扩展。 e-TeX 是对 TeX 宏机制的一组补充——\protected\unexpanded、更多寄存器、从右到左的排版支持等等——现代 LaTeX 认为这是理所当然的。历史上,启用 e-TeX 的 pdfTeX 作为 pdfetex 发布,并从 TeX Live 2004 开始成为默认引擎。您可以放心地将今天的 pdflatex 视为 pdfTeX-with-e-TeX。

PDF 输出,或者仍然是 DVI

默认情况下,它直接生成 PDF,但 pdfTeX 仍然可以发出 DVI。开关是整数参数 \pdfoutput:将 \pdfoutput=1(任何正值)设置为 PDF,或将 \pdfoutput=0 设置为经典 DVI。使用 \pdfoutput=0 生成的 DVI 原则上与原始 TeX 发出的相同。

在第一页发货之前必须固定此值,并且您无法在文档中的 PDF 和 DVI 之间切换。在LaTeX中,包和驱动程序检测通常发生得很早,因此实际安全的地方是最顶层,在\documentclass之前。一些依赖 PostScript 特价的软件包,例如 PSTricks,有时需要 DVI→PS→PDF 路线,而这就是 \pdfoutput=0 赚取利润的地方。

latex
% Force DVI output even when run via pdflatex
\pdfoutput=0
\documentclass{article}
\begin{document}
This run produces a .dvi file, not a .pdf.
\end{document}

微排版

如果没有微型排版,pdfTeX 的描述就不完整。这正是 Hàn Thế Thành 博士论文的主题,*TeX 排版系统的微排版扩展*,于 2000 年 10 月在马萨里克大学信息学院进行了答辩,论文题目是 Jiří Zlatuška — 一系列微妙的调整,融入到 TeX 的断行算法中,使文本块的边缘变得平滑,甚至使文本块的边缘变得平滑。行内的间距。这个想法可以追溯到 Hermann Zapf 和 Peter Karow 开发的 hz-program

第一个是字符突出,也称为边距字距调整。通过让句点、逗号、连字符和标点符号稍微超出文本块的边缘,在纯粹的机械对齐下看起来参差不齐的边距在视觉上看起来是直的。这是悬挂标点符号的旧做法的概括。

第二个是字体扩展,hz 算法。通过使用水平拉伸或收缩不可察觉的小量的字形形状,可以使字间间距更加均匀。 pdfTeX 将这个弹性空间折叠到断行决策本身中,选择更好的断点。结果是带有间隙字空间(所谓的“河流”)的行更少,并且段落的整体纹理更均匀。

这些可以用原始原语驱动。 Protrusion 使用 \pdfprotrudechars(0 = 关闭、1 = 开启、2 = 也反映在宽度计算中)以及 \lpcode(左边缘)和 \rpcode(右边缘)来设置每个字符的数量。字体扩展使用\pdfadjustspacing=2将拉伸集成到换行中)和\efcode一起使用,它设置了每个字符的拉伸意愿。在实践中你几乎从不直接接触这些。

在真实文档中,您只需加载 microtype 包,它包含所有这些内容并为您选择合理的默认值。单行 - \usepackage{microtype} - 通过良好的设置打开突出和字体扩展。

latex
\documentclass{article}
\usepackage{microtype} % protrusion + expansion, sensible defaults
\begin{document}
With microtype loaded, pdfTeX nudges punctuation into the
margins and flexes glyph widths a hair, so justified text
looks noticeably more even.
\end{document}

PDF 特征和图像包含

因为它直接构建 PDF,所以 pdfTeX 公开了触及 PDF 功能的原语。头条新闻是 \pdfliteral,它注入原始 PDF 绘图运算符; \pdfobj,直接创建一个PDF对象; \pdfannot,它放置注释(链接、表单字段等)。超链接和书签是由 hyperref 包构建在这些机制之上的。

对于文档范围的设置,有 \pdfinfo,它写入标题和作者等元数据; \pdfcompresslevel,设置输出PDF的压缩程度;和 \pdfpageattr,它将属性附加到每个页面。

latex
\pdfinfo{
  /Title (My Report)
  /Author (A. Author)
}
\pdfcompresslevel=9
% draw a thin rule with a raw PDF operator
\pdfliteral{0 0 m 100 0 l 0.4 w S}

图像也可以直接工作。 pdfTeX 的优点在于它可以包含 PNG、JPEG 和 PDF,无需中间转换(相比之下,EPS 必须首先转换为 PDF);在低级别,\pdfximage 读取图像。不过,通常情况下,您只需使用 graphicx 包中的 \includegraphics 即可,它会为您调用正确的原语。

原始它的作用
\pdfliteral插入原始 PDF 绘图运算符
\pdfobj / \pdfannot直接创建PDF对象/注解
\pdfinfo写入元数据(标题、作者……)
\pdfcompresslevel输出 PDF 压缩级别 (0–9)
\pdfximage包含 PNG / JPEG / PDF 图像
\pdfpageattr将 PDF 属性附加到每个页面

限制以及何时切换

尽管 pdfTeX 功能强大,但它的一些限制在今天看来已经过时了。最大的是它是8位引擎。它没有像 XeTeX 和 LuaTeX 那样采用 Unicode 作为输入的内置机制,并且它不是设计来直接排版的,比如日语 UTF-8(对于西方文本,这是用 inputenc/fontenc 修补的)。

字体处理也受到限制。指标取决于 TFM (TeX 字体指标)文件,实际字形通过映射文件从 Type1 或 TrueType 字体嵌入。您不能简单地命名操作系统上安装的 OpenType 字体并使用它。并且没有Lua之类的嵌入式脚本语言可以在排版过程中运行程序。

这正是为什么使用系统字体在 Unicode 中排版多种语言的愿望将人们推向 XeTeXLuaTeX。如果您是新手,尤其是日本人,那么这些引擎(日本人的 upLaTeX 或 LuaLaTeX)是实用的选择。

pdfTeX 本身现在处于稳定、或多或少冻结的维护模式。错误修复仍在继续,但新的开发已很大程度上转移到 LuaTeX (将 Lua 嵌入到 pdfTeX 的后继者)。即便如此,对于主要是英语和欧洲语言的文档,pdfTeX 仍然快速、可靠,并且是最经过考验的选择。

原语的遗产

pdfTeX 引入的许多 \pdf... 原语被继承到后来的引擎中并成为事实上的标准。例如,XeTeX 和 LuaTeX 都采用了微型印刷功能。

然而,在 LuaTeX 中,庞大的 \pdf... 命名空间被清理,其中大部分折叠成一小组网关 - \pdfextension\pdfvariable\pdffeedback。例如,\pdfliteral 变为 \pdfextension literal\pdfoutput 变为 \outputmode。您的 pdfTeX 时代知识大部分都会保留,但值得记住的是,新引擎上的拼写发生了变化。

适合日常写作的地方

对于英文论文、简短报告和现有的西方模板,pdflatex 仍然快速且可靠。加载\usepackage{microtype},保留图形为PNG / JPEG / PDF,并在包含之前将EPS转换为PDF。当您需要日语或系统字体时,不要继续在 pdfTeX 上堆砌解决方法;考虑 upLaTeX、LuaLaTeX 或 XeLaTeX。

  • 留下的理由:现有模板兼容性、速度和稳定的西方排版。
  • 切换的原因:Unicode 多语言工作、OS 字体、日语或基于 Lua 的处理。
  • 常见故障:在pdfLaTeX下加载fontspecfontspec 属于 XeLaTeX / LuaLaTeX。