您當前的位置:首頁 > 攝影

段尾右對齊指定語句

作者:由 紙鳶 發表于 攝影時間:2020-06-21

首先來了解下段落是怎樣結束的,以及結束的時候發生了什麼。

常見的結束標誌有三種情況:

\TeX

原語

\par

導致段落結束

空行會隱式地插入

\par

導致段落結束

在unrestricted horizontal mode中,碰到

\lang \text{vertical command}\rang

會插入

\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自己在合適的選擇斷行了。下面來了解下段落的斷行機制。

段落的斷行由

demerit

的值控制,每一行都有自己的

demerit

,TeX會選擇最合適的斷行方式使得總的

demerit

值最小。每行的

demerit

計算方法如下:

d=\begin{cases} (l+b)^2 + p^2 & \text{if } 0 \le p \le 1000\\ (l+b)^2 - p^2 & \text{if } -1000 < p < 0\\ (l+b)^2  & \text{if }p \le -1000\\ \end{cases}

l

代表

\linepenalty

(一般為10),

b

代表每一行的

badness

p

代表

penalty

badness

計算方法如下:

b= \min\left(10000, 100 \times \left( \frac{\text{actual amount stretched (shrunk)}}{\text{possible amount of stretch (shrink)}} \right) ^ 3\right)

接下來重新定義

\myright

\def\myright

#1

{

%

{

\unskip\nobreak\hfil\penalty

50

\hskip

2em

\hbox

{}

\nobreak\hfil

#1

\parfillskip

=0pt

\finalhyphendemerits

=0

\par

}}

如果在

\penalty50

處斷開,斷開生成的兩行的

badness

都是0,第一行有額外的50 penalty,第二行會把

\hskip2em

捨棄掉。如果沒有斷行,就會生成

badness

為0,penalty為50的一行,同時會在段落文字和右對齊的文字中間插入

2em plus 2fill

的glue。TeX會嘗試兩種斷行方式,看哪種的

demerit

值最小。

看看效果

段尾右對齊指定語句

標簽: 斷行  段落  nobreak  PAR  unskip