latex绘图笔记(一)
如此,繪圖軟件自然也可以分為兩種。下面將著重介紹繪制矢量圖的工具。矢量繪圖軟件也可以分為兩類 (其實所有的繪圖軟件都可以這么分類): 一類是 GUI ( Graphical User Interface,圖形用戶界面,屬于可視化 ) 的, 另一類是 CLI ( Command lineinterface,命令行) 的,兩種工具也大體代表了不同的理念。前者是 WYSIWYG (What You See Is What You Get),所見即所得;后者是 WYTIWYG (What You Think Is What You Get),所思即所得。具體到應用上,前者以 CorelDRAW、Adobe Illustrator、Inkscape 等為代表,后者以基于 LaTeX 的各種軟件或宏包為代表。本文只羅列這兩類常用的軟件,不涉及優劣比較。事實上,不同的軟件有不同的側重面,確實無法絕對的說哪種好哪種壞。
一、GUI前面已經說過 CorelDRAW、Adobe Illustrator、Inkscape 是 GUI 繪圖軟件中比較常見功能也最強大的軟件。CorelDRAW 和 Inkscape 我都用過,它們的界面非常像,功能也相當。不同的是 CorelDRAW 是商業軟件 (網上有破解版的), 而 Inkscape 是開源跨平臺的軟件 (目前最新版本是 0.91)。現在一直在用的就是 Inkscape,除了因為它是開源的外,最主要的原因是它支持 LaTeX 數學公式擴展,就是用 Inkscape 畫圖時,其中可以使用 LaTeX 命令生成漂亮的公式標注。這是其它軟件不具備的 (CorelDRAW 中使用公式需要從 Mathtype 或 Word 中復制過去)。下圖就是 Inkscape 的操作界面。 二、 CLI 目前科技論文寫作大都用的是 LaTeX 排版系統,尤其是投國外 SCI 雜志,他們幾乎都會要求用 LaTeX書寫,可能不僅是因為它完全免費、可跨平臺移植,最主要的是其排版精美漂亮甚至超過了一些商業軟件。LaTeX 本身也自帶了一些畫圖功能,不過只能畫一些簡單的交換圖等。我們可以利用一些基于 TeX 系統的宏包或工具來實現畫矢量圖的目的。這其中最著名的有如下四個:1. Metapost2. Asymptote3. PGF/TiKZ4. Pstriks前兩者屬于離線做圖工具;后兩者屬于在線做圖工具。什么叫離線做圖工具? 什么又叫在線做圖工具? 簡單來說,離線做圖就是單獨建立文件,然后生成 pdf 或 eps 等獨立的圖形文件,通過 \includegraphics 命令將圖形文件嵌入到 LaTeX 文件中。 Metapost 和 Asymptote 屬于這種。在線做圖就是直接在 TeX 文件中輸入相應宏包的繪圖命令,經過處理后直接生成圖形。PGF\TiKZ 和 Pstricks 屬于此類。
從語法上來說,Metapost 據說其語法比較怪異,很難學的精通 (我沒有用過,只是聽說);Asymptote 以前我用過,它的語法類似于 C/C++ (C 語言確實牛啊),后來之所以放棄主要是因為感覺離線作圖不太方便 (純個人感受);Pstricks 基于 Postscript,據說比較強大,但是我沒用過,不予置評。從功能上來說,各有所長,Metapost 可以解方程;Asymptote 的 3D 效果很不錯。這兩種方式并沒有優劣之別。離線做圖更靈活,在線做圖則更加方便,關鍵看個人喜好,就像比較 Vim 和 Emacs 哪個更好,我想答案只有程序員自己最明白。下面說一下 PGF/TiKZ,這是我現在正在用的,本身 PGF/TiKZ 是 TeX 的一個擴展宏包,使用非常方便,只需在 TeX 文檔的導言區加入命令 \usepackage{tikz} 就可以使用了。目前 PGF/TiKZ 可畫的圖形種類很多,像流程圖、有限狀態機圖、神經網絡圖、二維/三維數據圖等等。利用 PGF/TiKZ 的 plot 命令可以畫一些不太復雜的函數圖形,如果圖形很復雜我們還有辦法,那就是用基于 PGF/TiKZ 的另一個宏包 pgfplots (其實 PGF/TiKZ 也可以,不過 pgfplots 更強) 和其它軟件 (比如 Gnuplot,R,Matlab,Mathematica 等) 結合來繪圖。你也許會問為什么不直接用 Gnuplot 這類軟件畫圖呢,還搞得這么麻煩?那是因為雖然 Gnuplot,Matlab 這類軟件畫圖方便,但是它們畫出的圖不好看,尤其是標注自定義性很差,這會導致圖片與論文整體風格很不搭。這也許就是你看外國人的論文里圖片都非常漂亮而自己畫的圖卻不怎么好看的原因了。簡單來說,以 Mathematica 為例,我們可以用其強大的數據處理能力生成繪圖所需要的數據,先以文件形式導出 Mathematica 處理的數據( .txt 或 .dat 等),這一點很容易做到,只需要幾行 Mathematica 命令就搞定了,然后用命令 \addplot{filename.dat} 調用之前處理好的數據供 pgfplots 使用就 ok 了,這樣就會畫出既漂亮又可以自己定義標注風格的矢量圖了。如果使用 Matlab 畫圖,還有一個更方便的辦法,那就是使用 matlab2tikz,這是一個 matlab 腳本文件,可以將圖片的文件信息生成后綴為 .tkz 或 .tex 的文件,剩下的就是 \input 進 LaTeX 源文件編譯就行了。是不是 so easy!再也不用擔心我的圖片了 。。。
不管是 GUI 還是 CLI 的作圖工具都有各種的優點和缺點。GUI 更加直觀,這正是 CLI 的缺點;CLI 畫圖更加精確,而 GUI 則顯得有些粗糙,不是那么的精細。沒有哪一類工具可以通殺所有圖形,二者結合起來是很明智的選擇。當用 GUI 可以方便快速的畫出來時,完全沒有必要用 CLI 去畫,反之亦然。比如下面這個 Petersen 圖用 Inkscape 就很容易畫出來,此時就沒必要用 TiKZ 等工具來畫了。 然而,如果是下面這幅圖呢?顯而易見,如果使用 Inkscape 等 GUI 工具的話是非常麻煩的。 而如果使用 TiKZ 的話只需要下面這些代碼就可以完成:\documentclass{minimal} \usepackage{tikz} \usetikzlibrary{calc}\begin{document} \pgfdeclarelayer{background} \pgfdeclarelayer{foreground} \pgfsetlayers{background,main,foreground} \xdefinecolor{darkgreen}{RGB}{175, 193, 36} \newcounter{cntShader} \newcounter{cntRoot} \setcounter{cntShader}{20} \def\couleur{darkgreen}\begin{tikzpicture}\foreach \y in {86,38,15}{\setcounter{cntShader}{1}\coordinate (a) at (0,0);\coordinate (b) at (0:1);\foreach \x in {1,...,\y}{%\coordinate (c) at ($ (b)!1cm!270:(a) $);\begin{pgfonlayer}{background}\draw[fill=\couleur!\thecntShader] (a)--(b)--(c)--cycle;\end{pgfonlayer}\setcounter{cntRoot}{\x}\addtocounter{cntRoot}{1}\node[fill=white,draw,circle,inner sep=1pt] at (c){$\sqrt{\thecntRoot}$};\coordinate (b) at (c);\pgfmathsetcounter{cntShader}{\thecntShader+4}\setcounter{cntShader}{\thecntShader}}}\node[fill=white,draw,circle,inner sep=1pt] at (0:1) {$\sqrt{1}$}; \end{tikzpicture}\end{document}總結
以上是生活随笔為你收集整理的latex绘图笔记(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有些道理经历过就是道理,没经历过可能就是
- 下一篇: Win10打开应用商店提示“重试该操作”