考虑以下示例(纯 TeX 格式):
VA fi\par
V\-A f\-i
\bye
我尝试了 TeX、pdfTeX、XeTeX 和 LuaTeX,但只有在使用 LuaTeX 时,第二行才与第一行相同。我的问题是:
这是预期的行为吗?
让其他 TeX 引擎像 LuaTeX 那样工作是否困难或不可能(自由连字符不是破坏字距和连字)?
我怎样才能解决这个问题?
答案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
情况下进行处理,并且连字符(在本例中是错误的){}
f
l
fl
不是破碎。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。