tex
使用和编译以下示例luatex
:
\nopagenumbers
\parindent=0pt
\parskip=0pt
\def\par{\endgraf\hbox to 15em{\hrulefill}}
\hsize=1pt
\hfuzz=15em
1 'supercalifragilisticexpialidocious \par
2 s'upercalifragilisticexpialidocious \par
3 supercalifragilisticexpialidociou's \par
4 supercalifragilisticexpialidocious' \par
\end
情况 2) 为零时使用 Plain TeX\lccode
会终止连字符,这是理所当然的。为什么在情况 3) 中不是这样?TeXbook(第 454 页)可以在这里应用吗?
为什么 LuaTeX 中单词在所有情况下都使用连字符?此外,情况 2 中的连字符与其他情况不同。LuaTeX 中的连字符在哪些方面与 PlainTeX 不同?
答案1
这个老问题仍然没有答案,所以我给出一个关于纯 TeX 的问题。
TeXbook 在第 454 页指出:
TeX 通过从不在数学公式中的每个粘合项向前搜索来查找可能可连字符的单词。搜索会忽略以下字符
\lccode
为零的字符,或以此类字符开头的连字符;它还会绕过 whatsits 和隐含的紧邻项,即 TeX 自身根据字体存储的信息插入的字距。如果搜索到的字符带有非零\lccode
,或者找到以这样的字符开头的连字符,则该字符称为起始字母。
适用于四种情况,起始字母始终是s. 案例 1 TeX 绕过正确的引用。
接下来解释 TeX 如何找到单词的结尾:
如果找到合适的起始字母,则将其置于字体 f 中。除非
\hyphenchar
f 的值为 0 到 255 之间的数字(含 0 和 255),否则将放弃连字。如果通过此测试,TeX 将继续向前扫描,直到遇到以下三个“可接受项目”之外的内容:(1) 字体 f 中\lccode
非零的字符;(2) 完全由类型 (1) 的字符组成的连字符;(3) 隐式字距。第一个不可接受的项目终止此部分过程;试验单词由可接受项目中找到的所有字母组成。请注意,所有这些字母都在字体 f 中。
在案例 1 中,单词以空格结尾(所有字母都采用相同的字体),因此 TeX 会找到试验单词 supercalifragilisticexpialidocious。在第二种情况下,正确的引号会停止搜索,试验词是s. 类似地,案例 3 发现supercalifragilisticexpialidociou和案例 4 supercalifragilisticexpialidocious。因此案例 1 和案例 4 有相同的词。
然后 TeXbook 解释称,单词中的字母数必须至少为\lefthyphenmin
和的总和\righthyphenmin
(在纯 TeX 中为 5),才能将单词交给连字过程。因此,在情况 2 中,不会尝试连字。
案例 2 中的单词的其余部分不符合连字符条件,因为 TeX 会在粘合项后寻找起始字母。当然,如果
\hskip0pt
在案例 2 中将 插入到右引号之后,即 ,
s'\hskip0ptupercalifragilisticexpialidocious \par
TeX 会显示它可以在此其余部分中插入的连字符:up-er-cal-ifrag-ilis-tic-ex-pi-ali-do-cious。这与案例 2 中 LuaTeX 显示的结果相同。
答案2
LuaTeX 从未声称与 TeX 完全兼容,特别是它的连字算法与原始算法有很大不同。
例如,TeX 从不尝试对不遵循粘连的字符串进行连字,而 LuaTeX 却乐意这样做。
类似地,一个带有零的字符\lccode
会结束正在形成的单词,这将受到连字符的影响;然后,在该字符之后,LuaTeX 将开始形成一个新单词。如果你尝试
\nopagenumbers
\parindent=0pt
\hsize=1pt
\hfuzz=15em
supercalifragilisticexpialidocious'supercalifragilisticexpialidocious
\end
(是的,没有长单词前的初始空格)结果将是
正如预期的那样。或者,也许是出乎意料的,这取决于你的方法。LuaTeX 在各个方面都与 TeX 不同。