这个问题导致了一个新的方案的出现:
selnolig
至少对我来说,使用 (La)TeX 排版论文的主要吸引力之一是它能够自动且完全透明地使用印刷连字。然而,正如 Knuth 在 TeXbook 中指出的那样,有时需要禁用或抑制连字以提高单词的可读性(Knuth 以该单词为例shelfful
)或避免无意中改变其含义,这在某些非英语欧洲语言中尤其重要,例如德语,因为其中有很多复合词(即Sauf{}laden
vs.Sau{}fladen
和Chef{}innenleben
vs. Chefinnen{}leben
)。
这是我的问题,与我大约半年前在 comp.text.tex 上提出的一个问题有关,但这个问题没有得到任何好的答案:如果有人要编制一个应该抑制连字的单词列表,有没有办法让 TeX(可能/很可能是 LuaTeX)对这些单词不使用连字?请注意,我不是希望在整篇文档中全局抑制连字,但只抑制某些单词中出现的连字。
假设有这样一个单词列表
shelf{}ful, self{}ish, self{}less, half{}life, shelf{}life, dwarf{}like,
waif{}like, wolf{}like, half{}line, roof{}line, Pfaff{}ian, cuff{}link,
off{}load, off{}line, wolf{}fish, chaf{}finch, saf{}flower
有没有办法将此列表传递给 TeX,并指示它根本不插入连字符(例如shelfful
和shelflife
),或者仅使用两个字符而不是三个字符的连字符(例如Pfaffian
和offline
)?可能的话,这个无结扎列表还会向 TeX 指示应抑制连字符的方法。要抑制连字符,可以插入一对括号、{}
斜体校正\/
或零宽度字距\kern0pt
。但是,这些方法通常不会产生相同的结果,尤其是在fl
字符对的情况下,因此可能需要指示 TeX 在遇到无连字符列表中的单词时应采用哪种非连字符方法。
顺便说一句,请注意,上面列表中所有单词的无连字符实例都与潜在的连字符点相对应。这只是我个人的猜测:解决我提出的挑战的方法可能涉及创建两种类型的连字符点:第一种类型由“普通”连字符点组成,第二种类型的实例将告知 TeX 它正在处理连字符点和非连字符点。
9 月 16 日附录 - 我增加了 200 分的“赏金”。:-)
最终获胜的答案是...
我已经宣布 Aditya 的参赛作品为获胜者。这是他的 MWE 的修改版本,其中包含一个(非常!!)做作的句子,其中包含带有七种不同类型的连字的单词,这些连字应该被抑制(ff、fi、fl;ff-i、ff-l;f-fi 和 f-fl)。请注意,MWE 需要用 进行编译ConTeXt
。
\usemodule[translate]
\translateinput[shelffuls][shelf|*|fuls]
\translateinput[selfish][self|*|ish]
\translateinput[halflife][half|*|life]
\translateinput[standoffish][stand|*|off|*|ish]
\translateinput[cufflinks][cuff|*|links]
\translateinput[offloads][off|*|loads]
\translateinput[chaffinches][chaf|*|finches]
\translateinput[safflower][saf|*|flower]
\definetextmodediscretionary * {\prewordbreak\discretionary{-}{}{\kern0pt}\prewordbreak}
\hyphenation{chaf-finches}
\starttext
No ligatures disabled:\\
A standoffish and selfish person who offloads shelffuls
of cufflinks and doesn't watch chaffinches in the
safflower field has a short halflife.
\medskip
\enableinputtranslation
Some, but not all, ligatures disabled:\\
A standoffish and selfish person who offloads shelffuls
of cufflinks and doesn't watch chaffinches in the
safflower field has a short halflife.
\stoptext
答案1
在 LuaTeX 中,您可以拦截输入并在 TeX 看到之前对其进行更改。这可用于禁用某些连字符。这是 ConTeXt 中的概念证明。
\usemodule[translate]
\translateinput[selfish][self|*|ish]
\translateinput[halflife][half|*|life]
\starttext
A selfish person has a small halflife.
\enableinputtranslation
A selfish person has a small halflife.
\disableinputtranslation
A selfish person has a small halflife.
\stoptext
这使
有关实现细节,请参阅 ConTeXt 发行版中的 m-translate.mkiv。请记住,这将改变全部将“selfish”改为“self|*|fish”,包括 csname 中的。例如,如果你有一个selfish
环境,它就会失败!这种方法的优点是它适用于所有包含的单词selfish
;例如,,,selfishness
等等unselfish
。
|*|
禁用连字,不影响连字。但它会0.05em
在两个字母之间引入字距。如果您不喜欢,请添加
\definetextmodediscretionary *
{\prewordbreak\discretionary{-}{}{}\prewordbreak}
答案2
答案3
如果你使用 LuaLaTeX,你可以使用塞尔诺利格包。请注意,必须使用字体规格然后打包。
英语:
\usepackage[english]{selnolig}
德语:
\usepackage[ngerman]{selnolig}
更多信息:
- 新的软件包 selnolig,可以自动抑制印刷连字
- selnolig 与 babels 的解释“| 快捷方式:https://tex.stackexchange.com/a/389439/9075
- 关于 fontspec 和 lualatex 的讨论:如果使用 lualatex,我们可以不再推荐 fontspec 作为首选吗?