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是我之前写的一篇关于大英腐国大不列颠古典音乐发展的拙见~

相关文章
相关标签/搜索