LaTeX 更多“基本”命令

LaTeX 更多“基本”命令

目前正在学习如何编写包和定义自定义环境。

在许多例子中,我遇到了不熟悉的命令(例如\oalign)。到目前为止,我还没有在网上找到它们的含义。

是否有任何在线指南/存储库记录了所有这些命令的含义?

答案1

很多代码都没有文档记录。对于 LaTeX 内部结构,texdoc source2e它是你的朋友¹。对于 TeX 基元,TeXbook是一本不可或缺的指南,尽管网上还有其他优秀的免费书籍(如评论中所述)。也许对 TeX 内部结构最全面的介绍是 Stefan v. Bechtolsheim 的四卷巨作,TeX 实践,尽管很难找到价格合理的副本。

您的选择\oalign尤其值得注意,因为它是在纯 TeX 中定义的,但只在附录³中提到,其中 plain.tex 完整列出,并附有一些注释,但不是全部。在本例中,\oalign用于构建诸如重音符号\d(ạ) 和\b(ḵ) 以及版权符号 © 之类的堆叠字符。它的唯一真正“文档”是它的用法——请参阅 的第 679-690 行plain.tex

以下是该部分的经过修改和删节的版本,以展示其使用方法:

\def\oalign#1{%
  \leavevmode % ❶
  \vtop{% ❷
    \baselineskip=0pt% ❸
    \lineskip.25ex% ❸
    \ialign{##\crcr#1\crcr}% ❹
  }%
} 
\def\o@lign{%
   \lineskiplimit=0pt% ❸
   \oalign % ❺
}
\def\d#1{%
  {%
    \o@lign{%
      \relax#1\crcr % ❻
      \hidewidth\sh@ft{-1ex}.\hidewidth % ❼
    }%
  }%
}

首先\oalign要确保它处于水平模式❶。在 TeX 中,如果你不在段落中间,并且有一个框(无论是\hbox\vbox甚至\vtop\halign,该框都会被添加到垂直列表中,而不是开始一个新段落。\leavevmode如果我们还没有在段落中,则开始一个新段落,如果在段落中,则不执行任何操作。

\vtop❷ 是一个垂直框(因此它可以包含多行),但与它的近亲不同,\vbox框的基线将是框中第一行的基线(\vbox框的基线将是最后的框中的线)。

然后,我们有一堆用于设置行跳过的魔法(参见标记为 ❸ 的行)。行之间的间距基于三个参数:\baselineskip\lineskip\lineskiplimit。大多数情况下,从一个基线到另一个基线的跳过将是\baselineskip⁴。但是,如果从一行的顶部到下一行的底部的距离小于\lineskiplimit\lineskip则会添加额外的空间。⁵ 这是防止带有上标和下标的文本行相互冲突的机制。此处的设置有效地让字符以堆叠的方式打印,并且它们之间仅相隔 .25ex 的空间。⁶

\ialign❹ 是定义表格的基元的变体\halign。它确保为\tabskip0pt。在本例中,对齐仅用于堆叠内容。其\crcr功能类似于\\LaTeX 表格中用于分隔行的功能。⁷##\crcr开头的为表格设置模板,其中代表##单元格的内容。在本例中,我们说我们有一个单列表,其内容没有格式。

\oalign宏末尾的调用❺ 是 TeX 宏定义中常见的快捷方式。DEK 可以定义\o@lign

\def\o@lign#1{...\oalign{#1}}

但这种方法避免了两次复制参数。⁸

的定义\d让我们看到下点实际上是如何设置的。我们调用\o@lign⁹ 并给它两行进行对齐:第一行 ❻ 只是我们在下面放置点的字母。第二行是实际的点。第二行 ❼ 设置下点。这对\hidewidth...\hidewidth将点居中,但允许它在必要时伸出为其保留的空间。¹⁰\sh@ft如果字符以斜体显示,则调整字符的位置,以便例如,A将具有正确的底点定位。


  1. 在安装了 TeX 和相关软件的计算机上,您可以在命令行中输入某个软件包名称texdoc xxx在哪里xxx并获取有关该软件包的文档。在某些情况下,文档包括带注释的源代码。source2e是 LaTeX 内核的带注释的源代码²。
  2. 然而,这项工作仍在进行中,已经进行了近 30 年。有些章节的文档只是原始的 2.09 注释,在某些情况下可能已经过时。其他旧部分没有文档记录或文档记录不足。在某些情况下,为什么一些代码可能已经随着时间的流逝而消失了。
  3. 它太晦涩了,当我看到它时,我的第一个想法是,哦,他一定是打错了\noalign
  4. 好名字。
  5. 默认值为 0pt\lineskiplimit和 1pt \lineskip
  6. \ooalign我省略了将设置为\lineskiplimit的定义-\maxdimen,以便线条将完全重叠。
  7. 这样说有些过于简单,就像说一年有 365 天一样,但对于本次讨论来说,这样说就足够了。
  8. 从哲学角度来说,我喜欢将其视为尾部调用优化的一个相关概念。在从事 TeX 编程多年之后,当我第一次遇到 TCO 之类的东西时,它们的概念化并不困难。
  9. 我有点困惑,为什么 DEK 决定将所有对 的调用括起来,\o@lign而不是将括号合并到\o@lign。不仅所有调用都在一个组内执行,而且发生这种情况可能会很危险外部一个小组。

相关内容