LaTeX非主流技巧集錦

原文請猛戳:http://galoisplusplus.coding.me/blog/2013/04/13/latex-tips/php

早先我用MS office或open source的OOo來編輯文檔,後來漸漸轉向google docs和LibreOffice,學會了$LaTeX$後,因爲$LaTeX$所見即所得(WYSIWYG)的特徵節省了我很多排版的時間,因此現在成爲我撰寫文檔、幻燈片(beamer)的主要工具。如下主要是我折騰$LaTeX$的點點滴滴,有些也許不多能被用到(例如插入u3d來顯示3D物體),大部分也主要是一些不錯的輔助工具和如何解決我遇到的一些問題,若是你只是初學者、想系統地學習$LaTeX$,那麼我建議你看一下大名鼎鼎的A (Not So) Short In­tro­duc­tion to $LaTeX$;若是你看完這篇文章以爲有些工具不錯、想繼續深刻了解,我想最科學的方式仍是閱讀官方文檔、訂閱官方的user maillist,固然也歡迎與我交流啦XDhtml

<!-- more -->html5

關於參考文獻

我推薦使用BibTeX,儘管要編譯四次,但維護一個文獻數據庫卻經常能重用bib,免得下次要引用一樣的文獻時要加入重複的bibitem。目前我主要由mendeley desktop管理文獻,也由它來產生.bib文件。linux

有時候我須要分章節來顯示參考文獻,這時候要用到chapterbib。加入:
{% codeblock lang:tex %}
usepackage{sectionbib}{chapterbib}
{% endcodeblock %}
在對應的章節末尾加入日常在文章末尾加入的這兩行代碼便可(<bib-file>爲.bib文件的名稱):
{% codeblock lang:tex %}
bibliographystyle{plain}
bibliography{<bib-file>}
{% endcodeblock %}
若是正文中沒有出現引用而想把.bib文件的全部文獻放到參考文獻中,則須要在以上命令前加上:
{% codeblock lang:tex %}
nocite{*}
{% endcodeblock %}c++

關於代碼高亮(source code highlight)

我經常有須要在一些文檔或幻燈片中加入代碼,這時我但願代碼在$LaTeX$生成的目標文件中高亮並且我不須要修改要插入的代碼(例如爲關鍵字配置顏色)。git

過去我用的是listings,不過default的listings顯示出來並不如人意——尤爲是在beamer產生的slides裏,不進行一些配置會佔空間並且很難看。github

如下我用之前所用的一些顯示shell代碼的配置做爲一個簡單的示例:shell

% shell code highlight support  
% adapted from http://www.programmiersprachen.de/forum/board26-our-developer-boards/developer-lounge/7976-latex-shell-code-lstlisting/?s=03579afecc34ba7129d5a0145a93efeaabcfe45f  
\lstdefinestyle{Shell}{delim=[il][\bfseries]{BB}}  
\newcommand{\shellcmd}[1]{\\\indent\indent\texttt{\footnotesize\# #1}\\}  
\usepackage{xcolor}  
\usepackage{listings}  
\lstdefinestyle{BashInputStyle}{  
language=bash,  
basicstyle=\small\sffamily,  
numbers=left,  
numberstyle=\tiny,  
numbersep=3pt,  
frame=tb,  
columns=fullflexible,  
backgroundcolor=\color{yellow!20},  
linewidth=1.0\linewidth,  
xleftmargin=0.1\linewidth  
}

效果以下:數據庫

後來我在Stack Overflow上看到了這個問答:
http://stackoverflow.com/questions/1966425/source-code-highlighting-in-latex
因而試用了下minted,感受很是符合個人須要:支持的語法、顯示的樣式都不少。minted項目的主頁是http://code.google.com/p/minted/,因爲它用pygments來作代碼高亮,因此須要安裝Python和pygments。編程

如下是我用minted顯示的CUDA代碼片斷:

以上效果只須要在$LaTeX$代碼中將要顯示的代碼放在如下兩行中間便可,很是方便:

\begin{minted}[frame=lines,linenos,mathescape]{c}  
\end{minted}

另外須要注意的是:若是你用XeLaTeX的話,minted中代碼的Tab會顯示爲^^I,固然你能夠在編輯器中很容易將Tab替換掉(例如在vim中把Tab換爲兩個空格):

:%s/^^I/  /g

不過更好的方法是傳入-8bit參數到xelatex指令裏,編譯tex源文件(&lt;tex-file&gt;)的完整命令是:

xelatex -shell-escape -8bit <tex-file>

可參見stackexchange上的這個連接:
http://tex.stackexchange.com/questions/36841/using-minted-and-tabs

與listings相比,minted的一大缺點是沒法自動換行和word warp,固然比較優雅的代碼通常都不會把一行寫得又臭又長,但畢竟寫代碼的屏幕和文檔的寬度不一樣,仍是會有一些行比較長、顯示效果不佳的狀況,這時候用minted的話須要自行調整。

PS.個人blog也是用Pygments來作代碼高亮的。

關於畫圖

我一直以爲直接用$LaTeX$畫圖是一大硬傷,我的以爲畫圖遠不像通常的文本WYSIWYG——只須要管好編輯,$LaTeX$作好排版——而是常常須要編譯出來看效果再回頭調位置參數,麻煩得緊。

這方面,我早先試過用xypic,xypic的xymatrix已經基本能對付通常的關係圖了,但我更看中的是它支持object。我也曾經用這一特性來畫過一個parser輸入輸出的簡單示意圖:

生成這張圖的tex源代碼以下:
{% include_code http://galoisplusplus.gitcafe.com/downloads/code/structure.tex %}
不難看出,用xypic來作object關係的設定很是簡單,我大部分的編輯時間實際上是耗在肯定座標和頁面設置的參數上。

另外一種在$LaTeX$中畫圖的方式也許要算MetaPost(相似於$LaTeX$源於Knuth大牛的TeX,MetaPost衍生於Knuth的MetaFont)了,不過我沒用過,聽說比較偏底層(從wiki上的例子來看確實如此)。我在法國某實驗室實習的時候卻是有幸接觸到了一個相關的工具mlpost(OT一下,其中一名開發者剛好是與我同一組的researcher)——mlpost實際上是對MetaPost的一層ocaml接口,也能夠定義抽象層面的object,再對object進行操做。不過我最近有須要畫圖時,在archlinux上裝了最新的mlpost後卻跑出很多問題,懷疑是一些ocaml包的依賴沒解決好的問題,有空再解決吧~

接下來推薦一下Graphviz的DOT語言。DOT對high level的畫圖支持得很好,並且極好上手,我大概花了不到半小時看了一下官網的tutorial和一些sample就能夠着手用DOT畫我想要的圖。

例以下面這張圖:

用DOT只需這麼寥寥幾行代碼:
{% include_code http://galoisplusplus.gitcafe.com/downloads/code/GPUencode.dot lang:c++ %}

DOT支持多種格式,我用的比較多的是ps,用下面的命令編譯便可:

dot -Tps <dot-file> -o <ps-file>

PS.最近試了一個在$LaTeX$文檔中畫甘特(gantt)圖的package:
http://www.martin-kumm.de/tex_gantt_package.php

還挺方便的XD

關於顯示3D物體/圖表

這個問題我折騰了許久,其實折騰的原由本來也不是很重要——某個實驗結果我已經用octave產生了一張3D的圖,這張圖徹底能夠說明我想闡述的結論,不過要旋轉這張3D圖到不一樣視角才能夠看得很清楚,但是我懶得去產生幾張2D圖——想來我能夠看成遷就「負心智動量(negative mental momentum)」(參見Ron Hale-Evans的《Mind Performance Hacks: Tips & Tools for Overclocking Your Brain 》)的典型了,好在結果還算蠻cool的。XD

我最先是在一份slides中偶然發現movie15能夠插入Matlab的u3d文件,生成的pdf在Adobe Reader中能夠顯示u3d的3d圖。但如今movie15已不被維護,取而代之的是media9

安裝media9比較麻煩的是須要安裝好它所依賴的$LaTeX$3的package,本來我想經過Arch下的TeXLive Local Manager來解決依賴問題,但AUR的texlive-localmanager-git已是孤兒包(oraph package),安裝出現各類問題,因此我最後是自行到CTAN去下依賴的sty到/usr/share/texmf-dist/tex/latex/&lt;package-name&gt;/*(這是Archlinux下的路徑,不一樣發行版的路徑可能不一樣!)再執行

mktexlsr

texhash

media9的使用倒還好,照着文檔作就能夠了。
當前我還不太滿意的地方是:

  • u3d只能用Matlab生成,沒法在octave裏產生。(若是octave能夠,請告知偶一聲哦,偶會很感激的~XD)

  • 目前就我測試的結果,3d圖只能在windows的Adobe Reader上才能播放,linux下的pdf閱讀器(包括Adobe家的)都沒法正常顯示。(好象是flash的一些問題?)

  • 3d圖的座標軸文字沒法顯示。

關於$LaTeX$轉html

有時候用$LaTeX$生成文檔後經常想把它的內容直接做爲一個網頁(例如項目的介紹),我很早前就對這個很感興趣,甚至想本身折騰一個~巧得很,在法國實習的時候,我所在的組裏有兩位大牛是bibtex2html的做者,其中一位researcher(當時仍是我組裏的vice leader)的我的主頁就是用latex文檔轉成html生成的,也正是他的主頁讓我發現了以前尋覓已久的工具:HEVEA(PS.現在這位researcher的主頁已經改由yamlpp生成)。

因爲法國人對Ocaml編程語言有着一種特殊偏好,HEVEA一樣也是由Ocaml所寫,能夠處理公式、圖片、表格、參考文獻等等,如今還支持html5,效果不錯。如下是我github page的一篇essay的轉換效果:
http://yszheda.github.com/2009-11-01-GBClassicalMusic.html
PS.這篇essay是我之前寫的一篇關於大英腐國大不列顛古典音樂發展的拙見~

相關文章
相關標籤/搜索