继续如何自动为德语缩写添加空格和http://tex.stackexchange.com/a/134856,我们中的一些人倾向于在缩写中排版一个通常的或很窄的空格,例如,
d.\@ h, d.\ h., d.\,h., z.\@ B, z.\ B, z.\,B.
尽管 DIN 5008:2011(现已被取代;有人可以查阅更新吗?)在其中排版了一个常见的不可中断空格,而根本没有提到任何宽度变化,但z.°B.
他们提供的示例是用等宽字体排版的。但是,我们更经常使用比例字体,因此我们可能还认为稍微减少缩写中的不可中断空格的宽度更好(就像 TeX.SE 的许多人一样)。有些人说它应该是正常空格宽度的一半;参见http://www.master-bachelor-korrektur.de/abstaende.php。
使用 cmr10,间距长度为 3.33pt,因此我们得到
d.\kern1.665pt h., z.\kern1.665pt B.,
这足够接近
d.\kern.16667em h., z.\kern.16667em B.
或者
d.\,h., z.\,B.
在文本模式下。如果您希望更接近 DIN5008:2011,您也可以在区间 [最小{薄空间,半空间},常规空间[] 中取其他值;确切的值对于问题的要点可能并不重要。
现在,当排版真的很多文本,你迟早会遇到两个问题:
A. 固定宽度\kern
数字你的缩写有时与行的其余部分相比看起来太宽或太窄,并且
B. 在窄栏中,有时您想避免文本跑到右边距或段落的最后一行,最终导致段落其他位置的单词太空或不利的连字符。
问题 A 可以通过在缩写空间内添加拉伸和收缩组件来解决,问题 B 可以通过引入非最大惩罚来解决:
d.\penalty5000\hskip.16667em plus.08333em minus.08333em h., z.\penalty5000\hskip.16667em plus.08333em minus.08333em B.
这引出了两个问题:
上面的 5000 是一个不知从何而来的值,是 50% 的,
\@M
我们无法解释为什么它是\@M
/2 而不是\@M
/3 或 2\@M
/3 或者只是 1。对于惩罚来说,一个好的通用值或值范围是什么(小于我目前的猜测,即区间 [1, 9999])?上面,我们取了大约 50% 的自然宽度作为拉伸和收缩属性。同样,1/2 是无缘无故的 — 它也可以是 ]0,1[ 中的任何其他值,例如 1/3 或 2/3。对于拉伸和收缩属性的百分比,有没有更明智的选择?
独立于此并遵循 David 的评论如果缩写内的句号后跟 \hskip 或 \hspace,是否需要特别注意?,我们希望避免使用 pt 或 em 中的绝对值,而是使用相对于与空间相关的字体尺寸的值。因此:
- 如何表达
\hskip.5*\fontdimen2 plus.5\fontdimen3 minus.5\fontdimen4
在 LaTeX 中正确吗?当然,如果您不喜欢 1/2,只要您对此有很好的解释,就可以随意取其他百分比。或者,如果您觉得有必要并且可以解释,您可以对这三个参数采用\fontdimen2
、\fontdimen3
和的其他线性组合。\fontdimen4
答案1
3 人份
\fontdimen
接受两个参数,参数编号和从中获取参数的字体。\font
返回当前字体,因此\hskip.5\fontdimen2\font plus.5\fontdimen3\font minus.5\fontdimen4\font
对于 1
这取决于您通过添加惩罚来尝试防止什么。TeX 将尝试找到换行符以最小化总不良性,因此不能单独考虑该点的值,您需要考虑如果换行符不在此处发生的情况,通常一些空白会被拉伸以允许次优断点,因此拉伸将产生不良值,并且如果惩罚要产生效果,您需要使中断缩写的惩罚大于拉伸空白的惩罚。
在第一个测试中,您会发现很容易避免之间的断点!!
。如果惩罚为 10,则采用该断点,但低至 20 的惩罚已足以防止在该点处发生断点。
在第二场测试中,此时要避免破发就更加困难了,即使最高非强制性罚分 9999 也不够。
因此,没有明确的规则来决定你想要预防什么,以及你愿意在多大程度上容忍次优替代方案带来的不良影响
\documentclass{article}
\begin{document}
3) \hskip.5\fontdimen2\font plus.5\fontdimen3\font minus.5\fontdimen4\font X
\noindent X\dotfill X
\def\test#1{\par$#1$\par
aaaaaaaaaaaaaaaaaaaaaaaaaaaa aaa a a a a a a4 a a a a a a a7 a a a a 8 aa!\penalty#1\,! bbb}
\test{-10000}
\test{10000}
\test{20}
\test{10}
\test{00}
\noindent X\dotfill X
\def\test#1{\par$#1$\par
aaaaaaaaaaaaaaaaaaaaaaaaaaaa aa aaa aaa aa aa aaaaaaaaaaaaaaaaaa7 aa!\penalty#1\,!bbb bbbbbb}
\test{-10000}
\test{10000}
\test{9999}
\end{document}
2 人份
这在一定程度上取决于文化对缩写标点符号的期望,但我可能允许收缩幅度小于拉伸幅度。空间已经很窄了,所以在紧凑的线条中,如果你允许它减半,它可能看起来就像没有空间一样。在没有明显可见的空间的情况下,AB 看起来是否正确取决于你(或你的读者)对它的期望。
答案2
我认为您不希望在这样的缩写的中间出现换行符,但使用 却是可以实现的\penalty5000
。
您可以使用命令获得统一性:
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\abk}{m}
{
\tl_head:n { #1 } % the first letter
\exp_args:Ne \tl_map_function:nN { \tl_tail:n { #1 } } \aim_add_space:n
.\@
}
\cs_new_protected:Nn \aim_add_space:n
{
.\@\nolinebreak
\skip_horizontal:n { ( \fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font)*2/3 }
#1
}
\ExplSyntaxOff
\begin{document}
\abk{dh}
\abk{zB}
\abk{wxyz}
\makebox{word word \abk{zB} word word}
\makebox[1.3\width][s]{word word \abk{zB} word word}
\makebox[0.95\width][s]{word word \abk{zB} word word}
\end{document}
这里使用跳跃表达式将正常的单词间间距减少到 2/3。用该因子进行实验。
为了完整性,该命令可能会检查是否\spaceskip
非零,如果是则使用它。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\abk}{m}
{
\tl_head:n { #1 } % the first letter
\exp_args:Ne \tl_map_function:nN { \tl_tail:n { #1 } } \aim_add_space:n
.\@
}
\cs_new_protected:Nn \aim_add_space:n
{
.\@\nolinebreak
\dim_compare:nTF { \spaceskip > 0pt }
{
\skip_horizontal:n { \spaceskip*2/3 }
}
{
\skip_horizontal:n { (\fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font)*2/3 }
}
#1
}
\ExplSyntaxOff
\begin{document}
\abk{dh}
\abk{zB}
\abk{wxyz}
\makebox{word word \abk{zB} word word}
\makebox[1.3\width][s]{word word \abk{zB} word word}
\makebox[0.95\width][s]{word word \abk{zB} word word}
\setlength{\spaceskip}{1em plus 1em minus 0.5em}
\makebox{word word \abk{zB} word word}
\makebox[1.3\width][s]{word word \abk{zB} word word}
\makebox[0.95\width][s]{word word \abk{zB} word word}
\end{document}