「TeXBook筆記」修訂間的差異
Tankianting(討論 | 貢獻) |
Tankianting(討論 | 貢獻) |
||
(未顯示同一使用者於中間所作的 5 次修訂) | |||
行 353: | 行 353: | ||
空白含換行以<code>\par</code>不在垂直模式處理(認出) | 空白含換行以<code>\par</code>不在垂直模式處理(認出) | ||
`\bye` = `\vfill\eject\end`,其中: | |||
* `\eject` 輸出最末頁 | |||
* `\bye` 結束程式routine | |||
另外, | |||
* 以下指令進入interval vert. modeː `\vbox` or `\vtop` or `\vcenter` or `\valign` or `\vadjust` or `\insert` | |||
* 以下指令進入restrict hori. mode.:`\hbox` or `\halign` | |||
* `\kern`在垂直模式指垂直kern,水平模式指水平kern | |||
`\tracingcommands=1` 偵測目前執行到什麼模式 | |||
`\showlists` 也是檢視模式和排版元件的列表 | |||
== Ch14 斷行 == | |||
* `~`表示禁止換行空白 | |||
* `\hbox{...}`是反分拆的。 | |||
* `\slash`允許斷行的break。 | |||
* `\break`強制換行 | |||
* `\obeylines` 自動在行尾加入`\par` | |||
* TeX 在單字之間或連字符之後插入breakpoint,作為分析斷行的依據。 | |||
* 斷行前,段為hori. mode,包含下列元素: | |||
**box | |||
**discretionary break | |||
**whatsit | |||
**vertical material (`\mark`, `\vadjust`, `\insert`) | |||
**glob/glue | |||
** kern | |||
** penalty | |||
** math-on 或 math-off | |||
discretionary表達連字號的換行。 | discretionary表達連字號的換行。 | ||
行 367: | 行 398: | ||
glue、penalty、kern在許多情況可換行,discretionary可換行。 | glue、penalty、kern在許多情況可換行,discretionary可換行。 | ||
== Ch15 將段落分頁 == | |||
''個人註:其實可以參考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:資訊]] |
於 2025年1月17日 (五) 20:10 的最新修訂
講plainTeX的書。讀這本書建議搭配 TeX for the Impatient 這本書,查詢 plainTeX指令或變數的定義。
Double bend 的部分沒有讀,跳過,所以只是重點摘要而已。
\show\controlSequence 可以查詢controlSequence(姑且可理解為指令)的定義。
Ch1
講命名TeX的緣由
Ch2
講字元的輸入用法
kerning/ligature 自動啟用
kerning:VA中間自動adjust縮小間隙
ligature:合字(differ的iff)
- \thinspace
- \lq:英文左雙引號
- \rq:英文右雙引號
Ch3, 4
\xxx 是control sequence,比如:
- control word:\input␣MS(␣代表半形空白字元,下同)
- control symbol:\+符號+字母(不空白)
- \␣:指1個空格
- \␣\␣:指2個空格
連續空格代表同一個空格
\TeX␣\␣Ignore \TeX後面接空格以示區隔;\␣指空白
plainTeX有900以上指令,300+左右是Primitive不能細分的
\show\sl 回傳
\sl=macro:
\fam\slfam\tensl
- \slfam: slanted math mode font
- \tensl: 10 pt slanted
- \rm 羅馬體
- \sl slanted
- \it italic
- \tt monospace
- \bf bold font
the {\bf bold} font,中間的{}指定group
\/:義大利體修正
一個特例:{\bf f\/}
=>方能正確顯示出來
\temrm: set to 10pt roman \ninerm: set to 9pt roman
兩個都是字型變數
字型大小改變,會在基線上安排位置
\font\cs=外部字型
TeX只有16fonts
Ch5 Grouping
{ }:group character
{}定義在裡面的不會跑到外面
{\TeX}這樣可以避免吃掉空白的字元
或是\TeX{},{}是空群組
\centerline{要置中的文字}
{\it xxx},不會弄得外面也是義大利體
Ch6
(running TeX)
TeX有互動命令列
輸出log
\hrule 水平線
\vskip 1pt(6pt, .5cm,...) 垂直間距
\centerline
\sl
.~空白不換行
\vfill 充滿一頁
\eject跳出頁面
Ch7 TeX如何讀取輸入文字
輸入的行和輸出的行不相關。
- \n如空白
- 兩個空白於一列如同一個空白
- 空行表示段落結束
- 本章和次章講述非常首先的環節,TeX如何處理資料。
- TeX對文字有15分類,將ASCII 256字元分類如下:
類號 | 範例 | 說明 |
---|---|---|
0 | \ | 脫逸字元 |
1 | { | 群組頭 |
2 | } | 群組尾 |
3 | $ | 數學切換 |
4 | & | 表格定位 |
5 | [\n] | 換行 |
6 | # | 函數參數 |
7 | ^ | 上標 |
8 | _ | 下標 |
9 | < null > | 忽視字元 |
10 | <半形空白> | 空白字元 |
11 | [A-Za-z] | (一般字母) |
12 | 其他字元 | 其他字元 |
13 | ~ | active character |
14 | % | 註釋字元 |
15 | < delete > | 不合法字元(invaild) |
{ } $ & # ^ _ % ~ 不能用一般字元的寫法,原則上要加脫逸字元\_、\$等,但是\用\backslash
\^ 和 \~表diacritics於字母。
每一個character除了control sequence都是token,包含1個空白字元。
Ch8 TeX與輸入的字元
\char[10進數字] = \char'[8進數字]=\char"[16進數字]
輸入 ASCIIcode字元
\char`+(單名controlsequence|單字元) = 該字元
\\char98 不等於 \b,因為不能將\char用於control sequence中。
Ch9 TeX用的羅馬字體
該章講述TeX有連字設計(ligature)以及特殊符號、字元,和變音符號(diacritic)的打法。
Ch10 Dimension
plainTeX使用的單位有:
- pt
- pc pica
- in inch
- bg = big point = 1/72 in
- cm
- mm
- dd = didot point. 1157dd = 1238pt
- cc = cicero = 12dd
- sp = scaled point ( = 1/65536pt)
"3in" "3 in" " "+ 3 in" ".0pc" "-2.7pc"
都是合法大小。
TeX把各單位轉換成sp,並且利用整數型別來運算,確保精度。2^30sp (=5.78m)以上的dimen數值不處理。
\magnification=1200
放大到1.2倍。
但是magnification要確保電腦的字型支援。
\hsize=<dimen>
\vskip=0.5truecm
加上true
確保使用magnification的時候,還是能夠維持這個大小。
em、ex這種相對大小有用,但是不是具有統一標準。
<dimen>
可以指暫存器或參數。
只讀single bend不讀double bend
Ch11 Boxes 盒子
plainTeX的重要要素組成:box 和 glue
box 有參考點、height高度、depth深度、weight寬度
一個字母或是漢字也是box,TeX會自動把字母轉換成box,但box並非意味着字型都服服貼貼在盒子裏面,也可能像義大利體那樣,會溢出一部分。Italic correction就是義大利體外溢出盒子的量,以為修正。
\hrule
和\vrule
其實是很扁或很長的黑色方格子,如果要畫方格子,需要用\hrule
或是\vrule
。
\vbox{\hbox{foo}\hbox{bar}}
就可以組成盒子,但一般TeX會自己換行不用自己組。
頁是垂直排列盒子,行是水平排列盒子。
height, depth, width可以小於0,width小於0可作為倒退鍵功能。
\kern-1.6ex
(負數寬度盒子)
\lower0.5ex
(下移盒子)
\setbox0=\hbox{...}
設置box
\showbox0
%顯示box0的組成,顯示如:
. \hbox(高度+深度)x寬度 [, shifted 下移量]
Ch12 膠水 glues
box間的伸縮空隙
有stretch和shrink的權重
縮有限制量,伸有無限量。
段間的垂直glue:
\smallskip
\medskip
\bigskip
\vskip [預設dimen] plus [伸dimen] minus [縮dimen]
比如\vskip 6pt plus 2pt minus 2pt
水平glue\hskip .5em\relax
,\relax
表示之後沒有更多參數了。
利用無限伸展的glue,可以製作\centerline
,排右和排左的效果。
\vfill
= \vskip
垂直,0高度,可以無限伸展。
\vfil
很大,但\vfill
更大
\hfil
和 \hfill
類似
\hfilneg
和\vfilneg
,抵消\hfil
和\vfil
$\ldots$
產不那麼密集的「…」。
\frenchspacing \nonfrenchspacing
切換(取消)各空白一視同仁等寬
\kern
不能伸縮,\kern
處不換行,只有\glue
斷行
\line
= \hbox to \hsize
\hbox to [dimen寬度]
\hbox spread [dimen寬度]
(比寬度還寬)
\baselineskip=[glue]
預設基線間的間距 當上行格子太深,下行格子太高,使其間距小於\lineskiplimit=[dimen]
,則改用lineskip=glue
\panalty
禁止斷行,另有標記。
\hbox
和\vbox
\vtop
深度大的盒子 strut
支柱 - \rlap
右邊重疊 - \llap
左邊重疊 - \newcommand{\rlap}[1]{\hbox to 0pt{\hss\vbox{#1}}}
- \newcommand{\\lap}[1]{\hbox to 0pt{\vbox{#1}\hss}}
ch13 Modes 模式
plainTeX有6大模式,用來針對不同的用途排版用:
- vertical mode 組主要的main vertical list,將段落排成頁面,預設模式
- interval vertical mode為vbox組垂直列表
- horizonal mode 將一串文字組成段落
- restricted horizonal mode為hbox組水平列表
- math mode 數學模式(行中, inline)
- display math mode 數學公式,作為獨立於段落的物件
在處理子盒子裏的東西排序,比如於hbox裏面,用restricted horinal mode排列
\indent
進入水平模式,段落內插入空白縮排盒子\noindent
:進入水平模式,不插入空白縮排盒子
\vskip
使用則強制進入垂直模式
\par
等於兩個換行,調整為垂直模式,再調整回去水平模式。
hori. mode ---> $ 1+1=2 $ ---> hori. mode math mode,插入段中
hori. mode --(結束段)-> $$ 1+1=2 $$--(重開段)-> hori. mode disp. math mode
\[space]
會於段中翻譯成空格
空白含換行以\par
不在垂直模式處理(認出)
`\bye` = `\vfill\eject\end`,其中:
- `\eject` 輸出最末頁
- `\bye` 結束程式routine
另外,
- 以下指令進入interval vert. modeː `\vbox` or `\vtop` or `\vcenter` or `\valign` or `\vadjust` or `\insert`
- 以下指令進入restrict hori. mode.:`\hbox` or `\halign`
- `\kern`在垂直模式指垂直kern,水平模式指水平kern
`\tracingcommands=1` 偵測目前執行到什麼模式 `\showlists` 也是檢視模式和排版元件的列表
Ch14 斷行
- `~`表示禁止換行空白
- `\hbox{...}`是反分拆的。
- `\slash`允許斷行的break。
- `\break`強制換行
- `\obeylines` 自動在行尾加入`\par`
- TeX 在單字之間或連字符之後插入breakpoint,作為分析斷行的依據。
- 斷行前,段為hori. mode,包含下列元素:
- box
- discretionary break
- whatsit
- vertical material (`\mark`, `\vadjust`, `\insert`)
- glob/glue
- kern
- penalty
- math-on 或 math-off
discretionary表達連字號的換行。
\discretionary{此處斷行後的此行尾文字}{此處斷行後的次行首文字}{不斷行時的文字}
可hyphen處\discretionary{-}{}{}
dash/hyphen後面追加可hyphen處\discretionary{}{}{}
(空的dictionary)
- 個人註,或許空白也可以用這個表示,但沒試過
\discretionary{}{}{\glue{[spacewidth]}}
\penalty x
,表示可斷行,但給予懲罰值badness,x越高越難斷行。
glue、penalty、kern在許多情況可換行,discretionary可換行。
Ch15 將段落分頁
個人註:其實可以參考Pagination Reconsidered這篇論文,有更改進的分頁演算法
分頁的彈性不如段落。所以更為困難。如果垂直glue沒有辦法自由伸縮,如果太過靈活的話,各頁風格將會不規則。這種沒辦法完全自動化。
glue在一個獨立方程式物件(display)可以作為一個緩衝彈性。\smallskip, \medskip, \bigskip
也是可以調整的工具。
\eject
會讓內容區塊上下對齊,但是短內容,這樣會不好看,需要用\vfill\eject
。
\vadjust{\eject}
也是一種方法,強制該行斷行。
\nobreak
不斷頁,但是不取消\eject
的效果。
TeX用的演算法,不考慮全局演算,是局部最佳化。個人註:應該是貪婪演算法。
段落放入main vertical list(主內容垂直列表),這個列表包含:
- 盒子 hbox, vbox, rule
- 一個whatsit,容後解釋(double bend?)
- mark,容後解釋(double bend?)
- glob of glue or
\leaders
- kern
- penalty
penalty在這裏用於「分頁懲罰值」,可正可負,越大越難分頁。
\smallbreak, \medbreak, and \bigbreak
,越後面懲罰值越小,如果不能分頁,就各插入\smallskip, \medskip, \bigskip
。
伸展一點點的用\goodbreak
,\filbreak
(=\vfil\penalty-200\vfilneg
)是用於,除非後面的東西能夠放入空間,否則在此斷頁。
\raggedbottom
類似\reggedright
,使頁面不規則。
\tracingpages
是除錯用的吧。
接下來是講頁首頁尾的事了。
\topinsert[vertical mode可放的元素]\endinsert
TeX將會放置於頁首,然後如果空間塞不下,放於下一頁。vertical mode能放的東西包含段落。
在每個topinsert下面,會增加\bigskip
。
還有\pageinsert[vertical mode可放的元素]\endinsert
和\midinsert[vertical mode可放的元素]\endinsert
本章頁首頁尾都吐出來,不溢流到下一章節
\vfill\supereject
增加註解:prev.;\footnote*{Like this.}xxx
\footnote
和 \footnote*
:加註解,太長的話會移到次頁。
\footnote
不能在\topinsert
內使用。
TeX有暫存器,暫存器可以做排版用的運算。有256個暫存器可以儲存整數,另有256個儲存dimension(尺寸)、256個儲存glue的、256個儲存math glue(數學glue)的。
指派變數值:
\\count[編號] = 數值 \\dimen[編號] = 尺寸 \\skip[編號] = glue \\muskip[編號] = 數學glue
\dimen8=\hsize \advance\dimen8 by 1in
設置 \dimen8
這個暫存器加1吋。
如果無限大的glue加上去原有值,有限大的glue尺寸值就會消失。
數值可以乘除。 `\multiply\dimen4 by 3`
數值乘以三倍,\devide\skip5 by 3
glue除以3捨去餘數。
\dimen1=\skip1
把\skip1
刪除伸縮值再存入;\count2=\dimen1
,把\dimen1
轉成sc
的值(去掉單位,只留整數)。
\count0
~ \count9
特殊用途
\countdef\chapno=28
,\chapno
就變成\count28
的縮稱。
\box0~\box225
:儲存box的暫存器。
\setbox3=\hbox{A}
設置存放的box暫存器
\wd3
:暫存器3的寬度 \dp3
、\ht3
:暫存器3的深度與高度。
\raise2pt\box3
提高box3 2pt,且使其值為空。把\box3
改成 \copy3
就不會使內容物為空。
\unhbox
(\unvbox
) = 取出hbox(vbox)的內容物。