2010年2月7日 星期日

前置處理器

這些前置處理器會把前置碼翻譯成 nroff/troff 所用的 request escape 序列。通常這些處理器會在同一個 pipe 中處理同一個檔案。如:

% pic file | tbl | eqn | troff | spooler

多人系統上,通常會為了格式化功能建立一些通用 的 shell script,透過這個 script 去選擇格式化所使用的各個選項和前置處理器。當然這些前置處理器也可以分別執行。要檢查轉換的結果是否正確時很好用。比如:

% tbl file

會將每個 .TS/.TE 之間的的輸入換成 tbl 的指令碼。其它的輸入則維持不變。



Tbl

這是用來建立表格的前置處理器。若要在 pipe 中使用,則必須放在 eqn 之前。這樣比較有效率。tbl 的指令形式如下:

/usr/ucb/tbl [options] [files]

Options
-me              在檔案之前加上 me 巨集。
-mm              在檔案之前加上 mm 巨集。
-ms              在檔案之前加上 ms 巨集。
-TX              僅處理完整的垂直動作。nroff 格式化或是有些不支援半行高或是不到一行高的動 作的裝置上使用。


-------------------------------------------


一般指令碼形式

文字檔中的 tbl 指令碼形式如下:

.TS H
options;
format1
format2.
Column Titles
.TH
Item1              Item2              Item3
Item1              Item2              Item3 ...
.TE

tbl 處理是否成功關鍵就在於前面的檔頭是否正確。其 內容為一行的選項加上多行的格式指定行。每個表格的項目必須以 tab 字元隔開,同一行的項目都放在同一行內不可斷行,除非加上文字區塊符號 T{ T}.


----------------------------------------------------


Tbl 巨集

.TS              表格開始。
.TE              表格結尾。
.TS H              若表格大小超過一頁則使用這個。和 .TH 併 用,讓每一頁都會有表格檔頭。
.TH              .TS H 合用,表示檔頭的結尾。
.T&              改變格式行後繼續表格。

Options

Options會直接影響整個表格。Options之間可以 "," 或是空白隔開,不過每一行最後必須以 ";" 結尾。

center              " 目前 " 的邊界做置中。
expand              將目前的左右邊界都取消。
              取消目前左邊界(預設)。
box              加框。
doublebox              加雙框。
allbox              將每個項目都加框。
tab(x)              tab 字元設定為 x
linesize n              將線寬設定為 n 點。
delim xy              xy 當做方程式的分隔符號。

--------------------------------------------------

格式

格式行會影響個別的行欄排列狀態。每行都有一個關鍵字元代表表格中的一欄。每欄的項目要以空白隔開,而整個格式要以 "." 結尾。每一行格式對應到表格中的一行。只有最後 一行是對應到下一個 .T&(若有的話)之前的所有行。


關鍵字元

c              置中。
l              靠左對齊。
r              靠右對齊。
n              將數字項目對齊。
a              將字母子欄對齊。
s              將前一欄和這一欄做水平合併。
^              將前一行和這一行的同一欄合併。


關鍵字格式

下列符號必須加在關鍵字元之後:

b              粗體。
i              斜體。
fx              x 字型。
pn              點大小。
vn              垂直行距,單位為點。僅可用於文字區塊。
t              將垂直合併的欄位從上面開始排列。
e              等寬度欄位。
w(n)              最小欄寬。也可用於文字區塊。n 可以是任何 troff 所接受的單位。
n              欄間隔,以 en 為單位。預設為 3
|              將欄以單垂直線分開。用於關鍵字元之間。
||              將欄以雙垂直線分開。用於關鍵字元 之間。
-              將行以單水平線分開。代替關鍵字元。
=              將行以雙水平線分開。代替關鍵字元。



資料格式

資料的部份包括了檔頭和表格內文兩部份。每個表格 ? 的項目都要用 tab 來隔開。

.xx              可用 Troff request,如 .sp n.na 等等。
\              放在一行的最後時,表示將下一行和這一行視為同一行(隱藏換行)。
\^              將上一行的項目跨到本行來。然後置中對齊。
_ =              行中只有這兩個字元時,畫一條單線 (或雙線)橫過整個表格寬。
\$_ \$=              畫一條同欄寬的單線(或雙線)。
\_              畫一條同欄內容寬度的單線。
\Rx              x 印成和欄內容的寬度一樣。
...[tab]T{              將文字區塊當做表格的項目。必須放在一行的最後面。若輸入的資料超出一行的長度,或是輸出時會超過一行的長 度時,就必須使用這種格式。
...T}[tab]              文字區塊結尾,必須放在一行的開 頭。

Tbl 範例

輸入:
<<<<<< code >>>>>>

輸出:
<<<<<< table >>>>>>>>>>>



Eqn

Eqn 是用來列印數學方程式的前置處理器。若要使用 nroff,則必須用 neqnEqn 的指令列格式如下:

/usr/ucb/eqn [options] [files]

options
-dxy              x y 當做開始和結尾的分隔字元 ; 和使用 delimxy 一樣。
-fn              將字型設定為 n; 和使用 gfont 一樣。
-pn              將上標與下標字縮小 n 點。若不指定 -p,則預設縮小 3 點。
-sn              將點大小縮小 n 點,和 gsize 一樣。
-Tdev              將輸出針對 dev 裝置格式化。預設值由 TYPESETTER 環境變數指定。neqn 無此選項。


------------------------------------

Eqn 巨集

.EQ              方程式開始。
.EN              方程式結尾。

checkeq 指令來檢查是否有不成對的巨集。

數學符號

下列的符號名稱會以右欄的符號輸出。

符號               輸出                             符號               輸出
<<<<<<<<  table code >>>>>>>>>


數學文字

數字,大小括號,標點符號和下列的文字會以 Roman 字型印出:

<<<<<<<  code  >>>>>>>>>


希臘字母

希臘字母可以大寫或小寫印出。要印出希臘字母,只要打入其名稱即可。有些大寫的希臘字母可以直接用英文大寫來代替,所以不在此支援(如 大寫的 alpha A、大寫的 beta B)。

符號               輸出                             符號               輸出
<<<<<<<  code  >>>>>>>>>


特殊上下標號

Eqn 會將下列的特殊標號自動放置在字母上方正確的位置。bar under 會依照所需來延伸。

符號               輸出
<<<<<<<  code  >>>>>>>>>


---------------------------------------------------


Eqn 所使用的關鍵字元

除了以上的一些符號,eqn 還可以使用下列的關鍵字元:

above              將矩陣的列分開。
back n              向左移動 n 公釐。
bold              改成粗體。
ccol              將矩陣的列置中對齊。
cpile              將列向量中的元素置中對齊。
define              將常用的字串取別名。
delim xy              定義方程式左右的分隔字元為 x y。用 delim off 來關掉分隔字元。
down n              向下移動 n 公釐。
fat              將目前的字體加寬加粗。
font x              將字型換成 xx 可為單字元字型名稱或是字型編號。
from              定義下界。
fwd n              向右 n 公釐。
gfont x              設定所有方程式所用的字型。
gsize n              設定所有方程式所用的大小。
italic              改為斜體。
lcol              將矩陣的列元素向左對齊。
left              印出大型括號的左邊。
lineup              將不同行中的方程式標記對齊。
lpile              將列向量中的元素靠左對齊。
mark              將方程式中的某個位置予以標記,和 lineup 合 用。
matrix              建立矩陣。
ndefine              建立一個只有在 neqn 下有效的定義。
over              分數。
pile              建立列向量,每個元素都置中對齊。
rcol              將矩陣的列靠右對齊。
right              印出大型括號的右邊。
roman              改成 Roman 字型。
rpile              將列向量的元素靠右對齊。
size n              將字型大小改為 n
sqrt              畫根號。
sub              下標開始。
sup              上標開始。
tdefine              建立僅用於 eqn 的定義。
to              定義上界。
up n              向上移動 n 公釐。
~              輸出時強迫輸出空白。
^              輸出時強破輸出空白,但大小為 ~ 者的一半。
{}              強迫 eqn 將某元素當成單位。
'...'              引號內的文字 eqn 將不予以處理。


優先順序

若不使用括號,則 eqn 將照下表的優先順序進行處理,由左向右由上向 下:

<<<<<<<< table code >>>>>>>>>>>>>>>


下列向左結合

over  sqrt  left  right

其他向右結合




Eqn 範例:

輸入:

<<<<<<<  code  >>>>>>>>>

輸出:

<<<<<<<<< 方程 式 >>>>>>>>>>>>>>

輸入:
<<<<<<<  code  >>>>>>>>>

輸出:
<<<<<<<<<<<<<< 方程 式 >>>>>>>>>>>>>>>>


Pic

Pic 可以用來畫簡單的流程圖和簡單圖形。Pic 可用很多種不同的方法畫同一個圖形,因為有許多 種不同的寫法,還加上了英文的敘述。所以畫一條線,不只可以指定起點,長度和角度,也可以簡單地說 "from there to there"

Pic 的指令行形式如下:

/usr/ucb/pic [files]

Pic 的敘述行可以換行結束,或是以 ";" 結尾。若要跨行,則在第一行最後要加上 "\" 符號。一行的開頭若是 "#' 符號,則為註解。

Pic 巨集

.PS [h[w]]              Pic 敘述開始。若有 h w,則表示該圖形的高和寬 ; 最後的圖形會依照這個範圍來放大縮小。
.PS < file              file 的內容讀到目前行內。
.PE              pic 敘述結尾。
.PF              結束 pic 敘述,並回到前一個 PS 之前的垂直位置。
.xx              Troff request(或巨集)。


----------------------------------------

宣告

pic 敘述開始之前,可以宣告新的單位,或是宣告一些變數。Pic 會假設所使用的單位為 11,單位為吋。不過也可以用下列指令指定新的單位大 小為 1/n 吋:

scale = n

pic 所定義的變數所代表的意義即為數字,比如下列指 令:

line right n

可以在檔案的一開頭定義

a = n

然後寫成:

line right a


----------------------------------------


基本繪圖動作

pic 可使用一些基本的幾何繪圖指令。下列為所使用的指 令:

<<<<<<>>>>>>>> 語法 繪圖指令後可加上一些選項。選項稍後解說。 arc [cw] [options] ["text"]              畫一個弧(預設為 1/4 個圓)。cw 表示為順時針方向,預設為逆時針方向。 arrow [options] ["text"]              畫一個箭號。和 line -> 大致上是一樣的。 box [options] ["text"]              畫一個四方框。 circle [options] ["text"]              畫圓。 ellipse [options] ["text"]              畫橢圓。 line [options] ["text"]              畫線。 move [options] ["text"]              移動圖中的某個位置,就如同一條隱形線。 spline [options] ["text"]              可由 then 選項畫出一條圓滑的曲線。 "text"              以目前位置置中對齊的文字。 ---------------------------------------- Options 下列選項以功能區分。atwithfrom 指定的是點。點座標可以以垂直座標系來定位,或 是以相對於前一個物體的位置來定位。 right [n]              繪圖指令的方向。預設為前一個描述 所指定的方向。若要進行。 left [n]              對角線方向的動作,則可在選項中指 定兩個方向。每個方向後都。 up [n]                            可以加上其繪製的長度 n down [n] rad n              n 為角度(弧度)或是直徑繪圖。 diam n ht n              n 為高或寬繪圖。對箭號,直線或是 spline 來說,ht wid 指定的是 wid n              箭頭的寬度。 same              直接用上一個繪圖動作的參數。 at point              將物體置中於點 point 處。 with .position at point               將繪圖物體的位置(position)放在 point 之處。 from point1 to point2              從點 1 畫到點 2 ->              向右畫箭號。 <-              向左畫箭號。 <->              畫雙箭號。 chop n m              從開頭去掉 n,從結尾去掉 m。若只指定一個參數,則會從頭尾各去掉同一長度。 dotted              將線的形式設定為虛線,以點的形式 或以短線形式或是隱形。隱形線在。 dashed              輸出中依然佔空間。預設為實心線。 invis then ...              將繪圖方向改為另一方向。只可用於線、spline、移動和箭號。可在任何文字之前或之後使用。 ---------------------------------------- 文字 文字必須放在引號內。若要斷行,則將文字放在不同的引號內。文字預設以置中對齊方式印 出,下列參數則可改變對齊方式: ljust              垂直置中,水平向左。 rjust              垂直置中,水平向右。 above              垂直偏上。 below              垂直偏下。 ---------------------------------------- 物件區塊 一次可使用多個繪圖指令來繪製一個較複雜的圖形(如國旗)。若用區塊括起來,則這些多個指令就會被當成單一物件來處理: Object: [    description     .     .     . ] 中括號是用來當分隔字元的。請注意 object 的第一個字母需大寫。 ---------------------------------------- 巨集 可以在 pic 內定義巨集來處理重複的動作。語法如下: define sequence %       description           .           .           .       % 這裡的分隔字元是 "%",不過也可以用任何不在 description 內的字元來當作分隔。 巨集可以使用參數,由 $1 $9。以下列方式執行巨集: sequence (value1, value2, ...) ---------------------------------------- 定位 pic 敘述一開始時,若不加以指定,則開始座標為(0,0)。隨著各物體放到前一個物體的上方和左方,(0,0)這個點也一直會往下往右跑。 最後所有的點都會轉換成 x,y 座標。然後就可以用加減座標的方式取用畫面中的 每一點。比如:               2nd ellipse - (3,1) 也可以在物體後面加上 .x 或是 .y 來取用該物體的 x 或是 y 座標。比如: last box.x 就是指上一個畫的框的 x 座標。還有其他取用物體的方式: .x              物體中心點的 x 座標。 .y              物體中心點的 y 座標。 .ht              物體高。 .wid              物體寬。 .rad              物體半徑。 除非指定位置,不然下一個物體會從上一個物體結束的地方開始繪圖。不過,若繪圖指令用大括 號括起來,則繪製完成後會回到第一個括號開始之前的位置。 物體之間的定位 若要參考到前幾個物體,則必需使用其正確名稱。這可以由下列方式進行: 1. 依順序指定物體               1st box               3rd box               last box               2nd last box               2. 在定義物體時給定一個名稱。比如:   Line1: line 1.5 right from last box.sw 要描述兩個物體間的某個點,或是某個物體內的兩個點,可用下列方式: fraction of the way between first.position and second.position 可簡寫成: fraction 角落位置 參考到前一個物體時,pic 假設所用的參考點為前一個物體的中心點。但也可 用下列方式指定其角落位置: .corner of objetc object.corner 範例: .sw of last box last box.sw 下列為可指定的角落位置: n              s              e                            w              西 ne              東北 nw              西北 se              東南 sw              西南 t              頂端(和北一樣)。 b              底端(和南一樣)。 r              右端(和東一樣)。 l              左端(和西一樣)。 start              物體的起點。 end              物體的終點。 也可以指定下列的物體位置: upper right              lower right upper left              lower left 數學運算子 Pic 可使用下列運算子: +              -              *              /              %              取餘數 預設值 下列為控制預設物體參數的系統變數。可以用下列型式更改: variable = value 變數               預設值                             變數               預設值 <<<<<
>>>>>>> Pic 範例 輸入: <<<<<<<  code  >>>>>>>>> 輸出:

沒有留言:

張貼留言

推到 Twitter!
推到 Plurk!
推到 Facebook!