開發維護一個 TeX 宏包是怎樣的體驗?
LaTeX 的宏包大致可以分成三類:
- 模板類,這類宏包相對簡單同時適用範圍小,對常見宏包用法熟悉的 LaTeX 用戶都能寫;
- 需求類,這些是根據需求設計的宏包,相對複雜同時適用範圍大,需要對 LaTeX 有比較深入的了解才寫得出來,這類宏包比如有 geometry、fancyhdr、titlesec 等;
- 工具類,這些是輔助 LaTeX 編程的工具,涉及到展開控制、鉤子、判斷和循環等結構,這類宏包最為複雜,需要對 LaTeX 以及 TeX 的宏處理機制有深刻的理解,這類宏包比如有 etoolbox、l3bundle 等。
寫過的宏包大都是模板類。基本上來說,只要對 LaTeX 的常見宏包熟悉,了解一定的排版術語和規則就能寫了。模板從某種意義上說,就是把導言區的代碼,改頭換面放進一個 cls 或者 sty 文件裡面,再加上一些選項用於控制不同的效果。所以寫模板的過程實際上是對已有知識的不斷整合,以及對 LaTeX 不斷加深認識的過程。最開始寫的那幾個模板,儘管現在看來寫得很不好,但是對我熟悉使用 LaTeX 還是有不少幫助的。現在想來,我很感謝那段經歷,這是感受之一。
後來寫的模板就比較複雜一些了,除去常見宏包的常規使用,更多的時候要利用這些常見紅包以特別的方法拼接出好看的效果;甚至也有用 TikZ 等繪圖工具繪製版面的經歷。這時候寫模板的過程就已經超脫整合了,更多地帶有一些創造甚至設計的東西在裡面。看著好看的效果在我手中實現出來,那種喜悅是難以抑制的,這是感受之二。也有寫過一些需求類的宏包。現在想起需求類的宏包的話,第一反應是少就是多,這是感受之三。為什麼這麼說呢?需求類的宏包儘管稱之為「需求類」,但是其實兼容性要擺在功能之前。為了有良好的兼容性——包括與過去版本的兼容以及與其他宏包的兼容,在寫宏包的時候就應該避免使用稀奇古怪的代碼和實現稀奇古怪的效果,要嚴格遵守一些規範和約定俗成的規則。
寫需求類的宏包需要對生活有敏銳的觸覺,這是感受之四。儘管 geometry、hyperref 和 fancyhdr 這些宏包功能強大,使用者眾多,但是初次使用的時候並沒有很激動的感覺。這些最基本的功能大約在潛意識裡是肯定會有,是自然而然存在的。相反,有一些宏包在初次遇見的時候就會特別激動。比如 李清 的 xpinyin 宏包能給漢字注音;比如 劉海洋 的 diagbox 宏包能繪製斜線表頭(diagbox 的雙語文檔也是我第一次見到);比如 gezhu -Gezhu (warichu) typesetting macro for TeX/LaTeX 是實現割注效果的宏包(雖然它的語法很詭異)。遇見的這些宏包,都讓我特別激動,心中會有「原來還可以這樣」的感覺。誠然這些效果在我們的生活中並不少見,但是發覺它並實現它的人卻少之又少。我就比較笨,沒有這樣的觸覺,至今也就寫了一個蹩腳的 xprintlen 出來(笑)。
工具類的宏包我沒有寫過。他們太底層了,很難;而且該有的幾乎都有了,沒有下手的餘地。我印象里幾位前輩也都沒有寫過,不知道 李阿玲 有沒有這類工作。
我從 2012 年開始,至今寫過的、維護過的、提交過補丁的宏包已有不少。時至今日再寫宏包的話,其實已經沒有什麼特別的體驗了。大致的感覺已經只有「嗯,有人想要這個功能哎,好像還蠻有意思的」,然後自己也有興趣的話,就這樣很自然地做了。
這種持續不滅的興趣,以及「有些事總得有人要做」的想法,大約是繼續的動力吧。: )(哦,老闆喊我板磚咯……推薦閱讀:
※鼻子挺且好看是種什麼體驗?
※娃娃臉(童顏)是一種怎樣的體驗?
※吉他彈得很棒是一種怎樣的體驗?
※唱k一直不點歌不出聲是一個什麼樣的感受?
※做題恢復知乎友善度是怎樣一種體驗?