我正在阅读有关乳胶的文章,在几本书中都写道,为了能够将分隔符的大小调整为公式的垂直大小,我需要使用\left
和。我理解这一部分。但我感兴趣的是,LaTeX 内部使用分隔符和\right
的工作逻辑是什么?和在软件层面上起什么作用?\left
\right
\left
\right
答案1
当 TeX 遇到数学模式中的材料时,它会创建一个数学列表。数学列表是节点列表(noad
这里称之为节点),有时包含子列表,表示在数学模式下写入的所有内容。
如果你写
$f\left( stuff \right)$
带有分隔符的块被放入带有数学类的子列表中inner
,就像你写的一样
$f\mathinner{\left( stuff \right)}$
然后 TeX 将该\mathinner
部分无\left(
和\right)
放入水平列表中以确定其高度和深度。然后 TeX 尝试2*max(height,depth)
从此内部材料中添加高度+深度等于的分隔符。
TeX 如何创建这些分隔符?\delcode
分隔符的指向字体中的字符,如果该字符足够大,TeX 会将其插入。否则,该字符可能包含一个next
字段,指示下一个更大变体的代码点。然后 TeX 再次尝试使用更大的一个。此过程重复进行,直到 TeX 找到足够大的分隔符或可扩展的分隔符。可扩展分隔符有多个部分,可以堆叠在一起并重复以形成任意大的分隔符。它们总是足够大,但它们必须主要由垂直段组成。
最后一部分可以使用刚刚发布的新版本 LuaTeX 进行定制。
如需了解更多详细信息,最好阅读TeXbook,附录 G,规则 19(另见第 152 页)。
答案2
这不是一个完整的答案,但在评论中,格式丢失了。让我们从第 22328 行开始,然后是tex.web:
@ We have dealt with all constructions of math mode except `\.{\\left}' and
`\.{\\right}', so the picture is completed by the following sections of
the program.
@<Put each...@>=
primitive("left",left_right,left_noad);
@!@:left_}{\.{\\left} primitive@>
primitive("right",left_right,right_noad);
@!@:right_}{\.{\\right} primitive@>
那么这说明了什么?这与 LaTeX 无关,它们是 TeX 原语。基本上,这说明您应该阅读 TeX 书籍(正如 David Carlisle 已经评论的那样,这其中的重要部分是附录 G)以了解这里发生的事情。
或者,您可以深入研究已记录的源代码(请参阅上面的链接)。因此,您可以简单地查找缺少的引用,例如,您可以继续执行第 13514 行:
And finally, we have |left_noad| and |right_noad| types, to implement
\TeX's \.{\\left} and \.{\\right}.
但由于找到所有相应的源代码需要花费相当长的时间,所以我还是建议阅读 TeX 书籍。