ConTeXt 與 LaTeX 一樣,也可以編寫宏包,稱為 module。
module 的文件名一般為 X-modulename.tex,其中的 X 可以是 m (module), p (private), s (style), x (xstyle), t (third), 優先級從高到低,不加前綴也可以,優先級最低。如果自己用,一般用 private,如果和他人共享,可以用 third,而 module 一般是系統保存,不建議。加載宏包就是 \usemodule[modulename] 即可,有的 module 可以傳遞參數。如果你需要加載文件名為 t-theirmodule.tex,不過你自己也寫了個 p-mymodule.tex,可以用 \usemodule[t][theirmodule] 加載。
module 編寫其實很隨意,不過寫一個優美的 module 需要遵循以下傳統:
以下列代碼開頭:- %D \module
- %D [ file=X-modulename,
- %D version=2000.01.01,
- %D title=\CONTEXT\ User Macros,
- %D subtitle=My Module,
- %D author=My Name,
- %D date=\currentdate,
- %D copyright=My Name]
复制代码 如果你需要在 module 載入的時候看到載入信息,可以加入:- \writestatus{loading}{Context User Module / My Module}
复制代码 註釋内容可以用 %D 註釋,這樣以 module 模式編譯後將會顯示為文檔,比如- %D \macros
- %D {\mymacro,\myanothermacro}
- %D These two macros are used to do something blah blah blah.
- \def\mymacro
- . . .
复制代码 一般來說,為了避免宏的衝突,我們盡量可以使用些特殊字符, \unprotect 將使這一切變得很容易,你可以使用很多特殊字符作為宏了,module 結束之前不要忘了 \protect 回來。下面所有含特殊字符的宏都假定在 \unprotect 與 \protect 之間。
如果你的宏為了實現某一全局設置功能,定義一個前綴將非常方便,而且可以避免衝突,比如- \definesystemvariable{ft} % ft for function
- \def\setupfunction
- {\dodoubleargument\getparameters[\??ft]}
复制代码 這樣一來,在 \setupfunction 中的 comma list 中的所有變量將都被加上 @@ft 前綴。如果你怕 ft 已經被註冊過,為防衝突,可以用一個稍微 dirty 點的做法,雖然不是很美,不過可以有效避免撞車:- \def\?????ft{@@@@@ft} % ft for function
- \def\setupfunction
- {\dodoubleargument\getparameters[\?????ft]}
复制代码 這麽長總沒有問題了吧,呵呵,不過還是要說:不建議,僅提供一個方法,建議的方法是用上述的 \definesystemvariable 命令,不要用兩個字母,多用幾個字母,很多都已經被註冊過了。
既然說到了 \getparameters,ConTeXt 有些系統的 parameter 的名稱,不過如果不巧,你要設置的某項參數沒有在 ConTeXt 的考慮之中,不用緊張,這不是世界末日,我們可以用下面的宏進行定義:- \setinterfaceconstant{xxx}{xxx}
复制代码 而“參數=變量”中變量名沒有定義,可以用如下:- \setinterfacevariable{yyy}{yyy}
复制代码 說了這麽多,可能有人看得一頭霧水:“你耍我呢?”下面我擧個例子說明一下 |