返回列表 回复 发帖

[ConTeXt] 基本 module 知識

本來是寫在 WIKI 上的,不過要吃飯了,下次完成,另外,發現寫那個太痛苦了,沒有設置代碼框框之類的,我就先在這裡寫,寫完再貼過去試試看能不能好看點
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 需要遵循以下傳統:

以下列代碼開頭:
  1. %D \module
  2. %D   [        file=X-modulename,
  3. %D         version=2000.01.01,
  4. %D           title=\CONTEXT\ User Macros,
  5. %D        subtitle=My Module,
  6. %D          author=My Name,
  7. %D            date=\currentdate,
  8. %D       copyright=My Name]
复制代码
如果你需要在 module 載入的時候看到載入信息,可以加入:
  1. \writestatus{loading}{Context User Module / My Module}
复制代码
註釋内容可以用 %D 註釋,這樣以 module 模式編譯後將會顯示為文檔,比如
  1. %D \macros
  2. %D   {\mymacro,\myanothermacro}
  3. %D These two macros are used to do something blah blah blah.
  4. \def\mymacro
  5.   . . .
复制代码
一般來說,為了避免宏的衝突,我們盡量可以使用些特殊字符, \unprotect 將使這一切變得很容易,你可以使用很多特殊字符作為宏了,module 結束之前不要忘了 \protect 回來。下面所有含特殊字符的宏都假定在 \unprotect\protect 之間。

如果你的宏為了實現某一全局設置功能,定義一個前綴將非常方便,而且可以避免衝突,比如
  1. \definesystemvariable{ft} % ft for function
  2. \def\setupfunction
  3.   {\dodoubleargument\getparameters[\??ft]}
复制代码
這樣一來,在 \setupfunction 中的 comma list 中的所有變量將都被加上 @@ft 前綴。如果你怕 ft 已經被註冊過,為防衝突,可以用一個稍微 dirty 點的做法,雖然不是很美,不過可以有效避免撞車:
  1. \def\?????ft{@@@@@ft} % ft for function
  2. \def\setupfunction
  3.   {\dodoubleargument\getparameters[\?????ft]}
复制代码
這麽長總沒有問題了吧,呵呵,不過還是要說:不建議,僅提供一個方法,建議的方法是用上述的 \definesystemvariable 命令,不要用兩個字母,多用幾個字母,很多都已經被註冊過了。

既然說到了 \getparameters,ConTeXt 有些系統的 parameter 的名稱,不過如果不巧,你要設置的某項參數沒有在 ConTeXt 的考慮之中,不用緊張,這不是世界末日,我們可以用下面的宏進行定義:
  1. \setinterfaceconstant{xxx}{xxx}
复制代码
而“參數=變量”中變量名沒有定義,可以用如下:
  1. \setinterfacevariable{yyy}{yyy}
复制代码
說了這麽多,可能有人看得一頭霧水:“你耍我呢?”下面我擧個例子說明一下
吃完飯再舉例子
1# Neals


嗯,发现了,那个编辑器不好用
    Committed To EXcellence
     追  求  卓  越
Advanced Language Of Formula Typesetting

  Stay Hungry, Stay Foolish
  1. \unprotect

  2. \setinterfaceconstant{myname}{myname}
  3. \setinterfacevariable{mydefault}{mydefault}

  4. \definesystemvariable{myex} % Exercise

  5. \def\setupexample
  6.   {\dodoubleargument\getparameters[\??myex]}

  7. \setupexample
  8.   [\c!myname=\v!mydefault]

  9. \def\test
  10.   {\doifelse\@@myexmyname\v!mydefault
  11.      {Neals}%
  12.      {\@@myexmyname}}

  13. \protect
复制代码
當你在文件中載入該 module 之後,就可以測試下面代碼:
  1. \usemodule[the-name-of-the-module]

  2. \starttext

  3. \test

  4. \setupexample
  5.   [myname=Ross]

  6. \test

  7. \setupexample
  8.   [myname=mydefault]

  9. \test

  10. \stoptext
复制代码
明天要考試了,我還是復習一下比較好,今天就這樣

hi aloft, 問個問題,WIKI 裡用的是 HTML 嗎?我打算直接存為 HTML 然後貼過去比較好看,升級論壇之後發現很多地方不熟悉,選擇字體的按鈕都找不到了。。。
6# Neals


是,高级功能里面可以选源代码模式就可以看和编辑HTML源代码
像 \setinterfaceconstant 这样的宏,从哪里可以查到它们的用法?
技术潜水员
7# aloft


源代码模式只能用html格式的语法去编写,是不是太累了? 熟悉html语法的用户估计不太多。呵呵
我觉得简单易用,可以很大的调动用户参与wiki的积极性。
像 \setinterfaceconstant 这样的宏,从哪里可以查到它们的用法?
LiYanrui 发表于 2009-6-14 20:14
沒有文檔可以查,只有緊跟潮流,ConTeXt wiki 上有每個 release 的 Change log,有時候也會出現說有個新的命令可以用了
返回列表