目前正在学习如何编写包和定义自定义环境。
在许多例子中,我遇到了不熟悉的命令(例如\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
。它确保为\tabskip
0pt。在本例中,对齐仅用于堆叠内容。其\crcr
功能类似于\\
LaTeX 表格中用于分隔行的功能。⁷##\crcr
开头的为表格设置模板,其中代表##
单元格的内容。在本例中,我们说我们有一个单列表,其内容没有格式。
\oalign
宏末尾的调用❺ 是 TeX 宏定义中常见的快捷方式。DEK 可以定义\o@lign
为
\def\o@lign#1{...\oalign{#1}}
但这种方法避免了两次复制参数。⁸
的定义\d
让我们看到下点实际上是如何设置的。我们调用\o@lign
⁹ 并给它两行进行对齐:第一行 ❻ 只是我们在下面放置点的字母。第二行是实际的点。第二行 ❼ 设置下点。这对\hidewidth
...\hidewidth
将点居中,但允许它在必要时伸出为其保留的空间。¹⁰\sh@ft
如果字符以斜体显示,则调整字符的位置,以便例如,A将具有正确的底点定位。
- 在安装了 TeX 和相关软件的计算机上,您可以在命令行中输入某个软件包名称
texdoc xxx
在哪里xxx
并获取有关该软件包的文档。在某些情况下,文档包括带注释的源代码。source2e
是 LaTeX 内核的带注释的源代码²。 - 然而,这项工作仍在进行中,已经进行了近 30 年。有些章节的文档只是原始的 2.09 注释,在某些情况下可能已经过时。其他旧部分没有文档记录或文档记录不足。在某些情况下,为什么一些代码可能已经随着时间的流逝而消失了。
- 它太晦涩了,当我看到它时,我的第一个想法是,哦,他一定是打错了
\noalign
。 - 好名字。
- 默认值为 0pt
\lineskiplimit
和 1pt\lineskip
。 \ooalign
我省略了将设置为\lineskiplimit
的定义-\maxdimen
,以便线条将完全重叠。- 这样说有些过于简单,就像说一年有 365 天一样,但对于本次讨论来说,这样说就足够了。
- 从哲学角度来说,我喜欢将其视为尾部调用优化的一个相关概念。在从事 TeX 编程多年之后,当我第一次遇到 TCO 之类的东西时,它们的概念化并不困难。
- 我有点困惑,为什么 DEK 决定将所有对 的调用括起来,
\o@lign
而不是将括号合并到\o@lign
。不仅所有调用都在一个组内执行,而且发生这种情况可能会很危险外部一个小组。