最终获胜的答案是...

最终获胜的答案是...

这个问题导致了一个新的方案的出现:
selnolig

至少对我来说,使用 (La)TeX 排版论文的主要吸引力之一是它能够自动且完全透明地使用印刷连字。然而,正如 Knuth 在 TeXbook 中指出的那样,有时需要禁用或抑制连字以提高单词的可读性(Knuth 以该单词为例shelfful)或避免无意中改变其含义,这在某些非英语欧洲语言中尤其重要,例如德语,因为其中有很多复合词(即Sauf{}ladenvs.Sau{}fladenChef{}innenlebenvs. 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,并指示它根本不插入连字符(例如shelffulshelflife),或者仅使用两个字符而不是三个字符的连字符(例如Pfaffianoffline)?可能的话,这个无结扎列表还会向 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

就在今天我发现了一个博客条目关于这个问题。事实证明,在 CTAN 上有两种现成的解决方案可以解决这个问题:

  • 林格斯使用 Ispell 中的单词列表
  • 利加泰使用基于音节的方法,与 TeX 的连字符不同

两者都是 TeX 独立的程序,在编译之前会修改源代码。两者都只适用于德语,但应该可以针对其他语言进行定制。

答案3

如果你使用 LuaLaTeX,你可以使用塞尔诺利格包。请注意,必须使用字体规格然后打包。

英语:

\usepackage[english]{selnolig}

德语:

\usepackage[ngerman]{selnolig}

更多信息:

相关内容