
繼續如何自動輸入空格(德語)縮寫和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,您也可以在區間 [min{thin space, half space}, Regular space[ 中取一些其他值;確切的值對於問題的要點可能並不重要。
現在排版的時候真的地段文中,您遲早會偶然發現兩個問題:
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。對於拉伸和收縮屬性的百分比,有更明智的選擇嗎?
獨立於此並遵循大衛的評論如果縮寫中的句點後面跟著 \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}
這裡使用skip表達式將正常的字間空間減少到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}