将处罚分配给一个自由裁量权人(不是所有段落)

将处罚分配给一个自由裁量权人(不是所有段落)

对于一个非常复杂、无法详细描述的问题,我需要在同一段落中为不同的自由裁量项设置不同的惩罚。使用 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段落末尾的当前值。

相关内容