2,728
次編輯
Tankianting(討論 | 貢獻) |
Tankianting(討論 | 貢獻) |
||
行 367: | 行 367: | ||
glue、penalty、kern在許多情況可換行,discretionary可換行。 | glue、penalty、kern在許多情況可換行,discretionary可換行。 | ||
== Ch14 將段落分頁 == | |||
''個人註:其實可以參考Pagination Reconsidered這篇論文,有更改進的分頁演算法'' | |||
分頁的彈性不如段落。所以更為困難。如果垂直glue沒有辦法自由伸縮,如果太過靈活的話,各頁風格將會不規則。這種沒辦法完全自動化。 | |||
glue在一個獨立方程式物件(display)可以作為一個緩衝彈性。<code>\smallskip, \medskip, \bigskip</code>也是可以調整的工具。 | |||
<code>\eject</code>會讓內容區塊上下對齊,但是短內容,這樣會不好看,需要用<code>\vfill\eject</code>。 | |||
<code>\vadjust{\eject}</code>也是一種方法,強制該行斷行。 | |||
<code>\nobreak</code>不斷頁,但是不取消<code>\eject</code>的效果。 | |||
TeX用的演算法,不考慮全局演算,是局部最佳化。個人註:應該是貪婪演算法。 | |||
段落放入main vertical list(主內容垂直列表),這個列表包含: | |||
* 盒子 hbox, vbox, rule | |||
* 一個whatsit,容後解釋(double bend?) | |||
* mark,容後解釋(double bend?) | |||
* glob of glue or <code>\leaders</code> | |||
* kern | |||
* penalty<br /> | |||
penalty在這裏用於「分頁懲罰值」,可正可負,越大越難分頁。 | |||
<code>\smallbreak, \medbreak, and \bigbreak</code>,越後面懲罰值越小,如果不能分頁,就各插入<code>\smallskip, \medskip, \bigskip</code>。 | |||
伸展一點點的用<code>\goodbreak</code>,<code>\filbreak</code>(=<code>\vfil\penalty-200\vfilneg</code>)是用於,除非後面的東西能夠放入空間,否則在此斷頁。 | |||
<code>\raggedbottom</code>類似<code>\reggedright</code>,使頁面不規則。<br /> | |||
<code>\tracingpages</code>是除錯用的吧。 | |||
接下來是講頁首頁尾的事了。 | |||
<code>\topinsert[vertical mode可放的元素]\endinsert</code> | |||
TeX將會放置於頁首,然後如果空間塞不下,放於下一頁。vertical mode能放的東西包含段落。 | |||
在每個topinsert下面,會增加<code>\bigskip</code>。 | |||
還有<code>\pageinsert[vertical mode可放的元素]\endinsert</code>和<code>\midinsert[vertical mode可放的元素]\endinsert</code> | |||
本章頁首頁尾都吐出來,不溢流到下一章節<br /> | |||
<code>\vfill\supereject</code> | |||
增加註解:<code>prev.;\footnote*{Like this.}xxx</code> | |||
<code>\footnote</code>和 <code>\footnote*</code>:加註解,太長的話會移到次頁。 | |||
<code>\footnote</code>不能在<code>\topinsert</code>內使用。 | |||
TeX有暫存器,暫存器可以做排版用的運算。有256個暫存器可以儲存整數,另有256個儲存dimension(尺寸)、256個儲存glue的、256個儲存math glue(數學glue)的。 | |||
指派變數值: | |||
<pre>\\count[編號] = 數值 | |||
\\dimen[編號] = 尺寸 | |||
\\skip[編號] = glue | |||
\\muskip[編號] = 數學glue | |||
</pre> | |||
<code>\dimen8=\hsize \advance\dimen8 by 1in</code> 設置 <code>\dimen8</code>這個暫存器加1吋。 | |||
如果無限大的glue加上去原有值,有限大的glue尺寸值就會消失。 | |||
數值可以乘除。 <code>`\multiply\dimen4 by 3`</code>數值乘以三倍,<code>\devide\skip5 by 3</code>glue除以3捨去餘數。 | |||
<code>\dimen1=\skip1</code> 把<code>\skip1</code>刪除伸縮值再存入;<code>\count2=\dimen1</code>,把<code>\dimen1</code>轉成<code>sc</code>的值(去掉單位,只留整數)。 | |||
<code>\count0</code> ~ <code>\count9</code> 特殊用途 | |||
<code>\countdef\chapno=28</code>,<code>\chapno</code>就變成<code>\count28</code>的縮稱。 | |||
<code>\box0~\box225</code>:儲存box的暫存器。 | |||
<code>\setbox3=\hbox{A}</code>設置存放的box暫存器 | |||
<code>\wd3</code>:暫存器3的寬度 <code>\dp3</code>、<code>\ht3</code>:暫存器3的深度與高度。 | |||
<code>\raise2pt\box3</code>提高box3 2pt,且使其值為空。把<code>\box3</code>改成 <code>\copy3</code>就不會使內容物為空。 | |||
<code>\unhbox</code>(<code>\unvbox</code>) = 取出hbox(vbox)的內容物。 | |||
[[category:資訊]] | [[category:資訊]] |