![将处罚分配给一个自由裁量权人(不是所有段落)](https://linux22.com/image/307349/%E5%B0%86%E5%A4%84%E7%BD%9A%E5%88%86%E9%85%8D%E7%BB%99%E4%B8%80%E4%B8%AA%E8%87%AA%E7%94%B1%E8%A3%81%E9%87%8F%E6%9D%83%E4%BA%BA%EF%BC%88%E4%B8%8D%E6%98%AF%E6%89%80%E6%9C%89%E6%AE%B5%E8%90%BD%EF%BC%89.png)
对于一个非常复杂、无法详细描述的问题,我需要在同一段落中为不同的自由裁量项设置不同的惩罚。使用 pdfTeX 似乎无法做到这一点(LuaTeX 有一个错误,但这是一个不同的问题)。
首先我尝试了(这些都是 Plain TeX MWE):
abc\penalty-10001\discretionary{d}{e}{f}ghi\bye
但这并没有打破自由裁量权本身。然后我尝试
abc\hyphenpenalty -10001\discretionary{d}{e}{f}ghi\bye
在 pdfTeX 下可以工作,但是当我尝试
abc\hyphenpenalty -10001\discretionary{d}{e}{f}ghi\hyphenpenalty 10001\discretionary{d}{e}{f}\bye
它不再起作用(自由裁量惩罚似乎都得到了段落中定义的最后一个)。有没有办法在“普通”的 TeX 或 LuaTeX 中实现我想要实现的目标?
[编辑]由于这似乎不可能,我已为 LuaTeX 二进制文件提出了补丁此主题。
[重新编辑]已报告功能请求这里。经过和团队讨论,它不会在TL2015之前完成,但肯定会在之后出现。
答案1
使用 luatex 0.85 的测试版本我从
\tracingoutput1
\tracingonline1
\showboxdepth1000
\showboxbreadth1000
abc\begingroup\hyphenpenalty -10001\discretionary{d}{e}{f}\endgroup
ghi\begingroup\hyphenpenalty 10001\discretionary{d}{e}{f}\endgroup
\bye
和一根木头
Completed box being shipped out [1]
\vbox(667.20255+0.0)x469.75499, direction TLT
.\vbox(0.0+0.0)x469.75499, glue set 14.0fil, direction TLT
..\glue -22.5
..\hbox(8.5+0.0)x469.75499, glue set 469.755fil, direction TLT
...\vbox(8.5+0.0)x0.0, direction TLT
...\glue 0.0 plus 1.0fil
..\glue 0.0 plus 1.0fil minus 1.0fil
.\vbox(643.20255+0.0)x469.75499, glue set 619.25812fill, direction TLT
..\glue(\topskip) 3.05556
..\hbox(6.94444+0.0)x469.75499, direction TLT
...\localpar
....\localinterlinepenalty=0
....\localbrokenpenalty=0
....\localleftbox=null
....\localrightbox=null
...\hbox(0.0+0.0)x20.0, direction TLT
...\tenrm a
...\tenrm b
...\kern0.27779
...\tenrm c
...\tenrm d
...\discretionary-10001|
...\glue(\rightskip) 0.0
..\penalty 400
..\glue(\baselineskip) 5.05556
..\hbox(6.94444+1.94444)x469.75499, glue set 448.9216fil, direction TLT
...\tenrm e
...\tenrm g
...\tenrm h
...\tenrm i
...\discretionary10001| replacing
....\tenrm f
....\tenrm d
...|\tenrm e
...\penalty 10000
...\glue(\parfillskip) 0.0 plus 1.0fil
...\glue(\rightskip) 0.0
..\glue 0.0 plus 1.0fill
.\glue(\baselineskip) 17.55556
.\hbox(6.44444+0.0)x469.75499, glue set 232.37749fil, direction TLT
..\glue 0.0 plus 1.0fil minus 1.0fil
..\tenrm 1
..\glue 0.0 plus 1.0fil minus 1.0fil
显示每个自由节点都记录了其本地值\hyphenpenalty
答案2
因此,正如 egreg 之前所写,您不能在一个段落中对不同的自由裁量权分配不同的惩罚。
因此,您的问题的答案是“否”。
从TeXbook,第 101 页:
“TeX 仅在断行时才会查看影响断行的参数。”
因此,TeX 读取段落后,便开始其换行任务。潜在断点将根据其相关惩罚进行评级。与自由断点相关的惩罚\hyphenpenalty
分别是\exhyphenpenalty
是有效的值在段落末尾。
通过声明\penalty
页你插入了一个潜在的断点,并附带一个惩罚页。 如果页 ≤ -10000 TeX 将总是在此断点处中断。
因此,如果您输入abc\penalty-10001\discretionary{d}{e}{f}ghi
到 TeX,您会在 处强制中断,\penalty
并且当 TeX 选择剩余的断点时,您插入的潜在断点\discretionary{d}{e}{f}
(仍然)会被考虑,并且惩罚值为\hyphenpenalty
段落末尾的当前值。