有没有办法对单词中的连字点应用不同的惩罚?

有没有办法对单词中的连字点应用不同的惩罚?

背景:单词内的连字符点的质量可能会有很大差异。尤其是在允许单词任意组合的语言中,例如德语。例如,考虑英语单词前提. 前缀后连字符应略优于词干中的任何其他连字符状况


与所有潜在连字点相关的惩罚由 决定\hyphenpenalty。如何\hyphenpenalty在本地更改(或增强) 以便 TeX 在换行期间将不同的惩罚与连字关联起来?

我第一次尝试将 a 放入命令\penalty10\discretionary,例如

pre\discretionary{-\penalty10}{}{}con\discretionary{-}{}{}di\discretionary{-}{}{}tion
\bye

但是 LuaTeX(目标引擎)拒绝编译该代码:

This is LuaTeX, Version beta-0.76.0-2013120414 (rev 4627)  (format=luatex 2013.12.11)  3 APR 2014 15:09
 restricted \write18 enabled.
**penalty.tex
(./penalty.tex
! Improper discretionary list.
<recently read> }

l.1 pre\discretionary{-\penalty10}
                                {}{}con\discretionary{-}{}{}di\discretionary...
? 
The following discretionary sublist has been deleted:
\penalty 10

我尝试过很多其他的安排\penalty或本地任务\hyphenpenalty,例如

\discretionary{{\hyphenpenalty=10-}}{}{}

但都没有成功。有什么想法吗?


更多背景:完全手动的解决方案是完全可以接受的。如果可以找到,计划是借助帕德里诺马包,它为 LuaTeX 中的模式驱动节点列表操作提供支持。该包仍在开发中,但您可能想查看示例。

那么,问题可以重新表述:将不同的惩罚与自由连字符相关联的节点列表会是什么样子?

答案1

不知道这是否算作答案,但对于评论来说太长了。无论如何:

我缺少的是 TeXbook 中的以下段落:

TeX 仅在换行时才会查看影响换行的参数。例如,\hyphenpenalty如果您希望 TeX 对一个单词中的连字符的惩罚比对另一个单词的惩罚更大,则不应尝试更改段落中间的 。

也就是说,对于我的想法来说,\hyphenpenalty它起作用太晚了。inside 是不允许的。而\penaltyoutside ,但在单词内部,似乎有副作用,比如抑制连字。\discretionary\penalty\discretionary

那么,有哪些方法可以教会 TeX 细粒度的连字偏好?看来重写 TeX 的换行例程是唯一的方法,就像 Sojka 和 Haralambous 已经做的那样。不幸的是,他们的工作从未成为主流。LuaTeX 作为游乐场具有很好的优势,即引擎的某些部分可以在运行时替换。无需再分叉另一个 TeX 引擎。

答案2

在当前的 LuaTeX 版本中(即自 TeXLive 2016 起),您可以使用关键字手动覆盖各个自由节点的惩罚penalty(它直接位于 \discretionary 之后,在 pre/post/replace 列表之前)。

例如,要以惩罚 10 作为前提条件、惩罚 20 作为前提条件、惩罚为默认值作为前提条件,您可以使用

pre\discretionary penalty 10{-}{}{}con\discretionary penalty 20{-}{}{}di\discretionary{-}{}{}tion
\bye

相关内容