我想为过早断句(或某些内容\command{...}
)设定惩罚或坏处。更具体地说,我希望换行的惩罚取决于换行在句子中发生的位置。
例如,我可能希望500
对第一个 内的句子进行额外的惩罚,对最后一个 内的句子进行10em
额外的惩罚。然后我可以对其进行调整,以便 LaTeX 仅在确实需要时才在开头附近进行句子的破坏。100
5em
这能实现吗?即使需要一些拆箱技巧,我也并不介意。
编辑:
如果我可以编写以下伪代码,这就是我所想的(在每个脚注的开头):
\setlength{\remaining}{remaining space left on line}
\setlength{\needed}{length of hbox with desired text}
\let\extrapenalty=0
\while \needed > \remaining
\if \remaining < 10em
\addto{\extrapenalty}{500}
\endif
\addtolength{\needed}{-\remaining}
\setlength{\remaining}{\textwidth}
\if \needed < 5em
\addto{\extrapenalty}{100}
\endif
\endwhile
\penalty{-\extrapenalty} % encourage break here
问题背景:我在回忆录中使用段落格式的脚注,但我发现换行不太好。我不介意长行在中间断掉,但我觉得开头断掉的话看起来特别糟糕。
例如:
1. This is a relatively long
sentence so if it breaks in
the middle it's okay. 2. The
problem is when it's broken
right at the start. It just
looks wrong. 3. This, on the
other hand, is probably okay.
答案1
这在 TeX 中实际上很难做到。对单词进行连字符连接或在单词空格处断行的惩罚是每个段落的设置,因此要在句子中间更改它们,您可能需要做出一些妥协。
最简单的做法是将句子的开头粘贴在一个框中
\mbox{2. The problem} is when it's broken
之后不会断开,the
但是这是绝对的防止断开的方法,因此可能会导致框过满或换行不当,并且即使换行发生在好的位置,它也会阻止单词空间拉伸或收缩,因此会导致行内间距不均匀。
如果你插入显式惩罚,那么单词空间的换行惩罚是可以控制的,这样你就可以
2.\nolinebreak[2] The\nolinebreak[2] problem\nolinebreak[2] is when it's broken
这将阻止在前两个空格处换行(您可以使用一些宏来提前解析以找到每个脚注中的前两个或三个空格并自动添加它们),但这不会影响连字,因此可能使单词更有可能连字(因为在单词后断行不太可取)。显然The
无论如何都不会连字,但一般来说这可能是一个问题。最好通过将每个单词单独框起来来防止连字。
2.\nolinebreak[2] \mbox{The}\nolinebreak[2] \mbox{problem}\nolinebreak[2] is when it's broken
同样,可以将宏插入到脚注代码中,该宏会自动对前两个或三个单词执行此操作。
就像是
\def\myfootnote#1{\footnote{\threewords#1}}
\def\threewords#1 #2 #3 {%
\mbox{#1}\nolinebreak[2]
\mbox{#2}\nolinebreak[2]
\mbox{#3} }
但也许需要进行一些额外检查,以防脚注中没有三个空格。