段尾右對齊指定語句
首先來了解下段落是怎樣結束的,以及結束的時候發生了什麼。
常見的結束標誌有三種情況:
原語
\par
導致段落結束
空行會隱式地插入
\par
導致段落結束
在unrestricted horizontal mode中,碰到
會插入
\par
導致段落結束
段落結束的時候,在段落最後一個元素後面會插入
\unskip
\penalty
10000
\hskip\parfillskip
\unskip
取消段尾任何可疑的glue,
\penalty1000
等同於
\nobreak
,
\parfillskip
等同於
0pt plus 1fil
。
接下來定義一個命令
\myright
使得作為引數傳入的文字在最後一行右對齊:
\def\myright
#1
{
\unskip\nobreak\hfill
#1
}
\hfill
覆蓋
\hfil
使得文字能右對齊。看看效果:
當留下的空間不足以放下需要右對齊的文字的時候會怎麼樣呢?
可以看到雖然
\nobreak
保證了在test前面沒有斷行,但是TeX自己在合適的選擇斷行了。下面來了解下段落的斷行機制。
段落的斷行由
的值控制,每一行都有自己的
,TeX會選擇最合適的斷行方式使得總的
值最小。每行的
計算方法如下:
代表
\linepenalty
(一般為10),
代表每一行的
,
代表
。
計算方法如下:
接下來重新定義
\myright
\def\myright
#1
{
%
{
\unskip\nobreak\hfil\penalty
50
\hskip
2em
\hbox
{}
\nobreak\hfil
#1
\parfillskip
=0pt
\finalhyphendemerits
=0
\par
}}
如果在
\penalty50
處斷開,斷開生成的兩行的
都是0,第一行有額外的50 penalty,第二行會把
\hskip2em
捨棄掉。如果沒有斷行,就會生成
為0,penalty為50的一行,同時會在段落文字和右對齊的文字中間插入
2em plus 2fill
的glue。TeX會嘗試兩種斷行方式,看哪種的
值最小。
看看效果