如何才能找出文本或数学公式中给定点的换行惩罚?一个例子是这里等号之前和之后的点:\(a + b = c\)
。
如果我编写复杂的公式,有时我想手动插入\penalty
值,但选择数字以获得我想要的效果(例如,我真的需要\penalty10000
防止某个特定公式中某个特定值之后出现换行符吗\mathrel
?)通常需要一个漫长的反复试验过程。知道\penalty
在没有人工干预的情况下公式中某个点的有效值是什么将有助于减少实验空间。
答案1
TeX 会自动在二元运算和关系符号后添加惩罚,但仅限于公式的外层(例如,不是组内{...}
或\left
和之间的公式\right
;和类似命令的参数\mathbin
也会构成子公式)。
这些惩罚的值存储在参数\binoppenalty
和中\relpenalty
。默认值为
\binoppenalty=700
\relpenalty=500
这些自动处罚是不是如果显式惩罚跟在二元运算或关系符号后面,则插入。即以下 Plain TeX 输入
\showboxbreadth=1000 \showboxdepth=1000
$a+b=c$\showlists
$a+b=\penalty100 c$\showlists
\bye
在日志文件中生成
### horizontal mode entered at line 4
\hbox(0.0+0.0)x20.0
\mathon
\teni a
\glue(\medmuskip) 2.22217 plus 1.11108 minus 2.22217
\tenrm +
\penalty 700
\glue(\medmuskip) 2.22217 plus 1.11108 minus 2.22217
\teni b
\glue(\thickmuskip) 2.77771 plus 2.77771
\tenrm =
\penalty 500
\glue(\thickmuskip) 2.77771 plus 2.77771
\teni c
\mathoff
对于第一行,它给出了
### horizontal mode entered at line 6
\hbox(0.0+0.0)x20.0
\mathon
\teni a
\glue(\medmuskip) 2.22217 plus 1.11108 minus 2.22217
\tenrm +
\penalty 700
\glue(\medmuskip) 2.22217 plus 1.11108 minus 2.22217
\teni b
\glue(\thickmuskip) 2.77771 plus 2.77771
\tenrm =
\penalty 100
\glue(\thickmuskip) 2.77771 plus 2.77771
\teni c
\mathoff
第二行。
如果您添加\penalty0
之后,=
只需将其设为可行的断点;通常,500 可以断点,10000 则禁止断点。
你不能提前知道什么是获得换行符的良好值。确保在之后获得换行符的唯一方法=
是添加\penalty-10000
。TeX 会根据整个段落来选择换行符。
影响换行的惩罚仅在少数情况下添加:
数学公式,如上所示;
在显式连字符或以连字符结尾的连字符之后,参数为
\exhyphenpenalty
;在可自由选择的项(可能由连字过程插入)之后,参数为
\hyphenpenalty
;在段落末尾 TeX 添加
\unskip\penalty10000\hskip\parfillskip\penalty-10000
来完成它。
这样做的结果是没有“在某一点处换行惩罚”的概念。惩罚只是 TeX 在计算一系列换行时考虑的因素之一,目的是获得较少的缺点。