自由连字符会破坏字距和连字符

自由连字符会破坏字距和连字符

考虑以下示例(纯 TeX 格式):

VA fi\par
V\-A f\-i
\bye

我尝试了 TeX、pdfTeX、XeTeX 和 LuaTeX,但只有在使用 LuaTeX 时,第二行才与第一行相同。我的问题是:

  1. 这是预期的行为吗?

  2. 让其他 TeX 引擎像 LuaTeX 那样工作是否困难或不可能(自由连字符不是破坏字距和连字)?

  3. 我怎样才能解决这个问题?

答案1

\discretionary{f-}{i}{fi}似乎有效。您可以定义一个宏来简化使用:

\def\dfi{\discretionary{f-}{i}{fi}}
\def\VA{\discretionary{V-}{A}{VA}}
VA fi\par
AD\VA NCE Nar\dfi na
\bye

虽然不太理想,但如果您没有遇到太多问题,那么您可以使用它。

无论如何,理论上用户不必太担心连字符,你的文档中是否设置了正确的语言?这需要很多规则来告诉 TeX 如何拆分单词。你还必须\hyphenation{wordwithf-ibreak wordwithV-Abreak}为特定单词添加规则;它确实运行良好(未拆分时连字符,拆分正确时连字符,而且你只需为整个文档设置一次)。

咆哮/疑问:我不明白为什么\-是原语。有什么必要?难道不能直接用 来定义吗\discretionary?这是我对 TeX 的疑问之一 :)

答案2

默认情况下,控制序列\-

\discretionary{-}{}{}

(参见 TeXbook 第 95 页)。 的第一个参数\discretionary,即休息前,指定在换行符前立即插入的内容如果插入换行符(此处:连字符)。第二个参数休息后,指定在发生换行时在换行后立即插入的内容(此处:无)。第三个参数,没有休息,指定要排版的内容如果没有换行符发生——这里:什么都没有,或者更准确和关键的是,一个空标记,{}

为了具体起见,请考虑以下示例:half\-line。这首先扩展为half\discretionary{-}{}{}line。假设单词不是在行末被分解。接下来发生的事情取决于正在使用的 TeX 引擎。

  • 假设正在使用 pdfLaTeX,则排版的是half{}line,并且fl连字被(正确地!)分解,因为这就是f{}l遇到时应该发生的情况。

  • 相比之下,在 LuaLaTeX 下,所有文本模式的 实例{}在最终处理之前都会被丢弃。因此,会在没有和之间的halfline情况下进行处理,并且连字符(在本例中是错误的){}flfl不是破碎。

  • XeLaTeX 下发生的情况部分取决于您系统上使用的 XeLaTeX 版本。例如,如果您使用 TeXLive2018,halfline并且half\-line都排版如果半行和行之间没有换行,则使用 fl 连字符。不过,在不久前的某个时候,如果half\-line遇到 fl 连字符,则会被抑制。

为了验证这些说法,只需在 pdfLaTeX、XeLaTeX 和 LuaLaTeX 下编译以下文档:

\documentclass{article}
\begin{document}
halfline half\-line
\end{document}

对于“普通”pdfTeX、XeTeX 和 LuaTeX,只需运行

halfline half\-line 
\bye

为了让所有三个引擎产生相同的输出,不要写half\-line。而要写hal\discretionary{f-}{l}{fl}ine。这样,只要没有换行符,就会使用 fl-ligature。

相关内容