TikZ 能干啥

TikZ 是 LaTeX 下的一個(著名的)繪圖宏包。那么 TikZ 能干啥呢?

流程圖,腦圖,類圖,函數圖,RNA 密碼子表,韋恩圖,分形,化學元素周期表等等。

如果你覺得還沒看過癮的話,可以到 TikZ and PGF examples 繼續欣賞。

這么說吧,絕大多數能夠精確描述的矢量圖,理論上都可以用 TikZ 畫出來。

(PS:我以前寫過一篇(還沒有寫完的)文章,詳細對比了不同作圖工具的優劣,以及適用場景,見: 常見繪圖工具的對比

TikZ 的名字由來

TikZ 的德文原文是 TikZ ist kein Zeichenprogramm, 這是一個 "GNU's Not Unix!" 式的遞歸縮寫。(是的,無聊的程序員們就是很喜歡這種文字游戲。)

翻譯成英文就是 TikZ is not a drawing program,中文意思是“TikZ 不是一個繪圖程序”。(程序員式冷幽默)

我在 PGF/TikZ 中文手冊 里將其譯作“繪何物為”,用了拼音的遞歸:Huì hé wù wéi。意即“‘繪’是什么呢”,當然也可以將“繪”直接作為動詞,理解成“繪制什么呢”。這樣中文含義就和原文含義形成一問一答,無論是形式上還是內容上,都有了合理的對應。

當然,這里夾雜了我的私貨,正文中依舊使用 TikZ 來指代這一繪圖系統。


Till Tantau 其人

TikZ 宏包的作者叫 Till Tantau,1975 年出生,現年 43 歲,在德國呂貝克大學理論計算機科學學院當教授。

TikZ 又叫 PGF/TikZ 宏包,這是因為 TikZ 發端于 PGF(Portable Graphics Format,便攜式/可移植圖形格式)。是的,形式上借鑒了 PDF(Portable Document Format,便攜式/可移植文檔格式)。

實際上,TikZ 只是 PGF 的一個前端,任何人(閑得慌的話)都可以基于 PGF 寫一套自己的前端。

那時候 Till Tantau 還很年輕,他想給自己的博士論文配點圖,所以寫了一些簡單的宏。結果寫著寫著就收不住了,于是就變成了今天這樣一個龐大的宏包,并且形成了一套系統的圖形語言。這個宏包 2003 年上傳到 CTAN 的時候,就叫 PGF。

你說我一個 LaTeX 的宏包,怎么就變成一套圖形語言了?

除了 PGF/TikZ 之外,Till Tantau 還寫了另一個宏包,叫 Beamer,相當于 LaTeX 界的 PPT。

Till Tantau 這人是個文檔狂魔……

我第一次接觸 Beamer 宏包的文檔時,一看有 200 多頁,人都傻了。畢竟我那時候沒見過世面,一般宏包的文檔大概也就幾十頁,看過的頁數最多的是 ctex 宏包文檔,也不過是 100 多頁(然后只有前30多頁是面向用戶的,后面的100多頁全是代碼實現……)。

直到我后來看到 1000 多頁的 TikZ 宏包文檔……

所以我現在見到其他幾十上百頁的宏包文檔,內心已經沒有任何波動了。


PGF/TikZ 相關的學習資源

PGF/TikZ 相關的學習資源很多,可以參考這個項目:xiaohanyu/awesome-tikz

基本列出了常見的高質資源,語言大多為英文。

中文資源相對零碎,社區用戶也不夠活躍,資源比較集中的地方有:

如果你英文較好,或者對 PGF/TikZ 已經有了一定了解,建議還是參考英文資源,并且善用搜索引擎(Google Is Your Friend),選擇合適的英文關鍵詞。

自然,我也在翻譯 PGF/TikZ 的英文文檔,項目地址在:Hansimov/pgfmanual-zh。目前還在早期階段。

不過,如果你剛接觸這個宏包,或者更愿意閱讀中文教程,不用擔心,這個系列專欄就是為你準備的。希望你能從中獲得知識和樂趣。

TeX 社區是非常歡迎新人的。畢竟在 Word 一統江湖的情況下,TeX 黨要團結一切可以團結的力量。

“總而言之,要團結一切可以團結的 TeX 用戶,這樣,我們就可以把 Word 派縮小到最少,只剩下 Markdown 主義和少數親 Markdown 主義的分子,即同 Markdown 主義有密切聯系的程序員和博客作者。對我們來說,朋友越多越好,Word 派越少越好。”(摘自 Hans《我們要堅持 TeX 主義一百年不動搖》)


怎么用好這些學習資源

雖然 xiaohanyu/awesome-tikz 里面列出的鏈接非常詳盡,不過我知道你們是懶得點進去看的。

資源在精不在多,所以我就提煉一下,選取比較重要的幾個說一說:

關于這些資源該怎么用,其實不同人需求不同,背景知識和學習能力也有差別,因此沒有適用于所有人的方法。

**最重要的是興趣。**比如我是手殘黨,畫畫寫字都不行,所以非常依賴計算機幫我排版優美的文檔和圖表,因此在這方面的興趣就非常濃厚,鉆研得自然也就相對多一點。(我也想像那些大觸一樣,手繪各種好看的作品啊……)

**首先,如果能吃透近 1200 頁的英文文檔,我想你大概就神功大成(身敗頭禿)了。**Till Tantau 寫的文檔真的是深入淺出、巨細靡遺,我每次看都自嘆弗如、望塵莫及。看文檔當然不僅僅要看內容,還得看他是怎么組織的,而且有時候在文檔的源代碼里,也能學到各種眼前一亮的 LaTeX 技巧。當然,這個文檔也可以當成字典來用,實用中碰到想不起來的,直接到文檔的對應位置查閱即可。

除了 Till Tantau 寫的文檔之外,還有一個列在 CTAN 上的 PGF/TikZ 文檔:A very minimal introduction to TikZ,能讓你了解一下基本的命令,大概半小時就能讀完。不過個人感覺這個文檔并不出色,初學者看完發現自己頂多畫個圓,可是教練我想畫的明明是上面你列舉的那些牛逼閃閃的圖啊。然而既然 CTAN 上把這個文檔列出來了,我也只好提一下以示尊重。

其次,TeXample 上的各種樣例值得反復觀摩。“凡操千曲而后曉聲,觀千劍而后識器;故圓照之象,務先博觀”。一個是看 TikZ 能做到什么程度,二個是看那些大牛是怎么做到的。源碼下載下來,先看看它畫了啥,再跑一下看能不能跑通,然后再改一改,看看不同地方是做什么的,最后再試試能不能自己也畫一個類似的。這跟書法和繪畫中的臨摹是一個道理。

**然后,是 VisualTikZ。**它類似一個 cheatsheat,也就是命令清單,羅列了各種命令的各種用法和細節,比 Till Tantau 的文檔更像一本字典。大概記得什么命令在文檔的什么位置就好了。

**再者,是 TeX 社區上帶有 tikz-pgf 標簽的問題:Questions tagged [tikz-pgf]。**目前這個 tag 下已經累計超過 2 萬個問題了,也就是說,作為初學者,你碰到的絕大多數問題一定有人已經碰到過、并且解決掉了。如果你谷歌自己的問題,發現第一個彈出來的是 TeX - LaTeX Stack Exchange 或者簡稱 TeX.SX 里的鏈接,那么你的問題有九成的概率可以解決了。

順便一提,沒事可以瀏覽一些 Votes (投票)比較高的提問,因為這些是最常見的問題,也就意味著你碰見它們的概率也最高。然后 TeX.SX 里有好多大佬喜歡在問題的評論區回答,而不是直接寫成答案,所以這些評論也是有必要都過一遍的。

**另外,就是善用搜索引擎。**真的,利人利己。這已經是老生常談了。

當然,如果你確實沒有搜到某個問題的答案,那么有兩種可能:一是你沒有搜索合適的關鍵詞(九成概率),二是確實沒人問過這個問題(一成概率)。這時不用顧慮和害羞,直接在 TeX.SX 上提問。一般情況下已經有類似問題了,這時會有大佬告訴你,你這個已經 duplicated (重復)了,然后甩給你一個鏈接,這時只要乖乖地點到對應鏈接學習就好了。如果真的沒人碰到過這個問題,而且半天也沒人回答,那么反思一下,這個問題是否是真實或合理的需求,對于這種非常邊緣和比較個人的問題,要么把它扔在一旁,要么嘗試自己動手解決。

關于如何提問,這里有一篇 提問的智慧,當然各種地方你都能搜到這篇貼子及其變種。

**最后,想要進階的話,功夫就在 TikZ 之外了。**除了熟練使用各種繪圖命令以外,還得清楚一些 TeX 的底層原理,要涉獵排版和設計領域的知識。這不但是個體力活,也是個技術活,更是個藝術活。我目前還沒有修煉到這層境界,自然也就不敢給出建議,期待有大佬能夠指點一二。


不知道多少人能看到這里,畢竟通篇都沒有寫這個宏包該怎么用。Talk is cheap, show me the code,教練,你整這么多虛的沒用,最起碼給個能跑的例子啊。

怎么說呢,“臣之所好者,道也,進乎技矣”。哈哈沒有啦,我們下一篇就講,別急。

我想,最終能用好并且喜歡上 TikZ 的人,應該也不會在乎這一兩篇的工夫。

選自:https://github.com/Hansimov/tikz-intro/blob/master/001%20intro/001_intro.md