「TeXBook筆記」修訂間的差異

出自Tan Kian-ting的維基
跳至導覽 跳至搜尋
 
行 368: 行 368:
`\showlists` 也是檢視模式和排版元件的列表
`\showlists` 也是檢視模式和排版元件的列表


== Ch14 將段落分行 ==
== Ch14 斷行 ==
* `~`表示禁止換行空白
* `~`表示禁止換行空白
* `\hbox{...}`是反分拆的。
* `\hbox{...}`是反分拆的。

於 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 3glue除以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)的內容物。