TeX - 行者无疆 始于足下 - 行走,思考,在路上

稀里糊涂的数模比赛

原来数模和acm本不是一个级别的。

数模,三人一队,十天一题。

原本我是学计算机的,谁曾想到那两人matlab倒也丝毫不落下风,因此我只能回到了自己的老本行——LaTeX写文档了。写文档当然要涉及到图表、公式、参考文献等等。因此我顺便进一步熟悉了下Linux环境下绘图工具的使用。

简单的说,绘图工具分为两类,一类是CLI的,另一类是GUI的。两种工具也大体代表了不同的理念,前者是WYTIWYG(What You Think Is What You Get),所思即所得,后者是WYSIWYG(What You See Is What You Get),所见即所得。具体到应用上,前者以\TeX派系为代表,后者以MS Word派系为代表。

我们先说第一类。和\TeX配合的绘图工具,我了解的有四个:

  1. metapost
  2. asymptote
  3. pgf\tikz
  4. pstriks

前两者属于离线做图工具;后两者属于在线做图工具。可能你又会问,什么叫离线做图工具?什么又叫在线做图工具?

简单来说,离线做图就是单独建立文件,然后生成eps等独立的图形文件,通过\includegraphics等类似的命令将图形文件嵌入到latex文件中(这样说也许不妥,因为latex文件经过不同处理可以生成多种类型的文件如dvi、ps、pdf等等,嵌入到latex中意思是“图形”嵌入到生成的文件中)。metapost和asymptote属于这种。

在线做图就是直接在TeX文件中敲相应宏包的绘图命令,经过处理后直接生成图形。pgf\tikz和pstricks属于此类。两种方式并没有优劣之别。离线做图更灵活,在线做图则更加方便。

从历史上来说,metapost和pstricks历史更长久一点,而asymptote和pgf\tikz则相对年轻。

语法上,metapost比较怪异;asymptote的语法仿照c++(可见c++确实是王道^_^);pgf\tikz我用过一段时间,感觉比较乱,毫无章法;pstricks基于postscript,据说比较强大,但是我没用过,不好评价。

能力上,各有所长,metapost可以解方程;asymptote的3d不错;pgf\tikz生成一些特殊的图如自动机、MindMap等效果非常好;pstricks,不知道了。其实我觉得四者精通其一即可“纵横天下”。

这里附上一些Gallery,做图能力强弱,大家自己分明:

  1. metapost: gallery1
  2. asymptote: gallery1
  3. pgf\tikz: gallery1, gallery2
  4. pstrikcs: gallery1, gallery2

上两张图,来猜猜是用什么画出来的。不要告诉我是photoshop、inkscape哦。

 

以上是基于CLI派基于\TeX的绘图工具。除此之外,graphviz也是非常有用的一个小工具。与metapost等重量级的工具相比,graphviz的长处在于轻便灵活。短短几句话可以生成多种格式的文件。他自创了一种dot language,并且自动提供了几种layout算法。graphviz尤其适合画流程图和类图,可以看看它的gallery。著名的源码文档工具doxygen生成类图时调用的就是graphviz。而且graphviz还提供了python语言的调用接口pygraphviz

提到这里,也就不能不提到emacs了。说emacs是神的编辑器,此言一点也不为过。gentoo:

sudo emerge -av graphviz-dot-mode

dot语言的语法非常简练,看看我简单探索的成果:

graphviz-dot-mode,快捷键:

  • C-c c: compile, 根据你想要的layout,输入相应的编译命令
  • C-c p: preview, 预览图片效果(期间遇到了一个问题,用dot生成嵌入中文的ps或eps文件时,在emacs中预览是正常的,但是嵌入到latex文件中就会出现乱码,这可能是文字编码之前。

还有两个工具:

可以将graphviz的dot文件转换为tex兼容的格式,直接嵌入tex文件中,具体我就没有用过了。

最后一个推荐的CLI派的绘图干将就是gnuplot了。gnuplot主要擅长数学数据的可视化,结合maximaoctave等等可以形成一套完备的CAS系统。而且据我所知,gnuplot本身也是支持metapost接口导出的。这是gnuplot的gallery,看看什么叫数学之美。

说了这么多废话,第一类总算数的差不多了。接下来再简单数数第二类。基于GUI的画图工具,汗牛充栋,大块的如gimp、inkscape等,做尔等工作,牛刀杀鸡也。

还是一些小工具来得实惠。首先推荐的当然是大名鼎鼎的dia了。引用其官方主页上的介绍:

Dia is a gtk+ based diagram creation program released under the GPL license.

Dia is inspired by the commercial Windows program 'Visio', though more geared towards informal diagrams for casual use. It can be used to draw many different kinds of diagrams. It currently has special objects to help draw entity relationship diagrams, UML diagrams, flowcharts, network diagrams, and many other diagrams. It is also possible to add support for new shapes by writing simple XML files, using a subset of SVG to draw the shape.

It can load and save diagrams to a custom XML format (gzipped by default, to save space), can export diagrams to a number of formats, including EPS, SVG, XFIG, WMF and PNG, and can print diagrams (including ones that span multiple pages).

有趣的是,dia还支持pgf/tikz、metapost、pstricks文件格式的导出。所以把dia当成信手涂鸦工具,导入tex文件中,倒会给一向严谨的tex添点趣味。

最后一个小工具,类似于windows下的几何画板,顺手画一些几何图形还是非常赞的,这就是Geogebra。我非常赞赏的两点是:

  • 像autocad一样,具有命令行模式,既能精确控制,又能随手泼墨;
  • 也支持多种格式的export,如metapost和pgf格式。

好了,这么晚了,说了这么多废话,但愿说者无意、听者有心。安。

终于搞定Ubuntu 9.04下XeTeX的配置了。

整整弄了三天。写了份《Ubuntu 9.04 环境下TEX中文化配置》,呕心之作。内容都在文档里面了。

主要内容包括:Ubuntu 9.04xeCJK配置

这是我使用的xeCJK模板。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Name: XeTeX+xeCJK日常使用模板
% Author: Lox Freeman
% Email: xiaohanyu1988@gmail.com
%
% 本文档可以自由转载、修改,希望能给广大TeXer的中文之路提供一些方便。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\documentclass[a4paper, 12pt, titlepage]{article}

%%%%%%%%%%%%%%%%%%%%%%%%%xeCJK相关宏包%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{xltxtra,fontspec,xunicode}

\usepackage[slantfont, boldfont, CJKaddspaces, CJKchecksingle]{xeCJK}
\CJKsetecglue{\hskip 0.15em plus 0.05em minus 0.05em}
% slanfont: 允许斜体
% boldfont: 允许粗体
% CJKnormalspaces: 仅忽略汉字之间的空白,但保留中英文之间的空白。
% CJKchecksingle: 避免单个汉字单独占一行。
% CJKaddspaces: [备选]忽略汉字之间的空白,并且自动在中英文转换时插入空白。

\CJKlanguage{zh-cn}                  % 中文标点特殊处理
\XeTeXlinebreaklocale "zh"           % 针对中文进行断行
\XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt
                                     % 给予TeX断行一定自由度
%%%%%%%%%%%%%%%%%%%%%%%%%xeCJK%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%日常所用宏包、通通放在一起%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 什么常用的宏包都可以放这里。下面是我常用的宏包,每个都给出了简要注释
\usepackage[top=2.5cm, bottom=3cm, left=2cm, right=2cm]{geometry}                               
                                     % 控制页边距
\usepackage{enumerate}               % 控制项目列表
\usepackage{multicol}                % 多栏显示

\usepackage[%
    pdfstartview=FitH,%
    CJKbookmarks=true,%
    bookmarks=true,%
    bookmarksnumbered=true,%
    bookmarksopen=true,%
    colorlinks=true,%
    citecolor=blue,%
    linkcolor=blue,%
    anchorcolor=green,%
    urlcolor=blue%
]{hyperref}

\usepackage{titlesec}                % 控制标题
\usepackage{titletoc}                % 控制目录
\usepackage{type1cm}                 % 控制字体大小
\usepackage{indentfirst}             % 首行缩进,用\noindent取消某段缩进
\usepackage{bbding}                  % 一些特殊符号
\usepackage{cite}                    % 支持引用
\usepackage{color,xcolor}            % 支持彩色文本、底色、文本框等
\usepackage{latexsym}                % LaTeX一些特殊符号宏包
\usepackage{amsmath}                 % AMS LaTeX宏包
\usepackage{bm}                      % 数学公式中的黑斜体
\usepackage{relsize}                 % 调整公式字体大小:\mathsmaller, \mathlarger
%\makeindex                          % 生成索引

%%%%%%%%%%%%%%%%%%%%%%%%%基本插图方法%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{graphicx}                % 图形宏包
% \begin{figure}[htbp]               % 控制插图位置
%   \setlength{\abovecaptionskip}{0pt}   
%   \setlength{\belowcaptionskip}{10pt}
                                     % 控制图形和上下文的距离
%   \centering                       % 使图形居中显示
%   \includegraphics[width=0.8\textwidth]{CTeXLive2008.jpg}
                                     % 控制图形显示宽度为0.8\textwidth
%   \caption{CTeXLive2008安装过程} \label{fig:CTeXLive2008}
                                     % 图形题目和交叉引用标签
% \end{figure}
%%%%%%%%%%%%%%%%%%%%%%%%%插图方法结束%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%fancyhdr设置页眉页脚%%%%%%%%%%%%%%%%%%%%
\usepackage{fancyhdr}                % 页眉页脚
\pagestyle{fancy}                    % 页眉页脚风格
\setlength{\headheight}{15pt}        % 有时会出现\headheight too small的warning
%\fancyhf{}                          % 清空当前页眉页脚的默认设置
%%%%%%%%%%%%%%%%%%%%%%%%%fancyhdr设置结束%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%listings宏包粘贴源码%%%%%%%%%%%%%%%%%%%%
\usepackage{listings}                % 方便粘贴源代码,部分代码高亮功能
\lstloadlanguages{}                  % 所要粘贴代码的编程语言

%%%%设置listings宏包的一些全局样式%%%%
%%%%参见http://hi.baidu.com/shawpinlee/blog/item/9ec431cbae28e41cbe09e6e4.html%%%%
\lstset{
numbers=left,                        % 在左边显示行号
numberstyle=\tiny,
keywordstyle=\color{blue!70}, commentstyle=\color{red!50!green!50!blue!50},
                                     % 关键字高亮
frame=shadowbox,                     % 给代码加框
rulesepcolor=\color{red!20!green!20!blue!20},
escapechar=`,                        % 中文逃逸字符
xleftmargin=2em,xrightmargin=2em, aboveskip=1em,
breaklines,                          % 这条命令可以让LaTeX自动将长的代码行换行排版
extendedchars=false                  % 这一条命令可以解决代码跨页时,章节标题,页眉等汉字不显示的问题
}
%%%%%%%%%%%%%%%%%%%%%%%%%listings宏包设置结束%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%xeCJK字体设置%%%%%%%%%%%%%%%%%%%%%%%%%
\punctstyle{kaiming}                                        % 设置中文标点样式
                                                            % 支持quanjiao、banjiao、kaiming等多种方式
\setCJKmainfont[BoldFont=Adobe Heiti Std]{Adobe Song Std}   % 设置缺省中文字体
\setCJKsansfont[BoldFont=Adobe Heiti Std]{Adobe Kaiti Std% 设置中文无衬线字体
\setCJKmonofont{Adobe Heiti Std}                            % 设置等宽字体
\setmainfont{DejaVu Serif}                                  % 英文衬线字体
\setmonofont{DejaVu Sans Mono}                              % 英文等宽字体
\setsansfont{DejaVu Sans}                                   % 英文无衬线字体

%%%%定义新字体%%%%
\setCJKfamilyfont{song}{Adobe Song Std}                     
\setCJKfamilyfont{kai}{Adobe Kaiti Std}
\setCJKfamilyfont{hei}{Adobe Heiti Std}
\setCJKfamilyfont{fangsong}{Adobe Fangsong Std}
\setCJKfamilyfont{lisu}{LiSu}
\setCJKfamilyfont{youyuan}{YouYuan}

\newcommand{\song}{\CJKfamily{song}}                       % 自定义宋体
\newcommand{\kai}{\CJKfamily{kai}}                         % 自定义楷体
\newcommand{\hei}{\CJKfamily{hei}}                         % 自定义黑体
\newcommand{\fangsong}{\CJKfamily{fangsong}}               % 自定义仿宋体
\newcommand{\lisu}{\CJKfamily{lisu}}                       % 自定义隶书
\newcommand{\youyuan}{\CJKfamily{youyuan}}                 % 自定义幼圆
%%%%%%%%%%%%%%%%%%%%%%%%%xeCJK字体设置结束%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%一些关于中文文档的重定义%%%%%%%%%%%%%%%%%

%%%%数学公式定理的重定义%%%%
\newtheorem{example}{例}                                   % 整体编号
\newtheorem{algorithm}{算法}
\newtheorem{theorem}{定理}[section]                         % 按 section 编号
\newtheorem{definition}{定义}
\newtheorem{axiom}{公理}
\newtheorem{property}{性质}
\newtheorem{proposition}{命题}
\newtheorem{lemma}{引理}
\newtheorem{corollary}{推论}
\newtheorem{remark}{注解}
\newtheorem{condition}{条件}
\newtheorem{conclusion}{结论}
\newtheorem{assumption}{假设}

%%%%章节等名称重定义%%%%
\renewcommand{\contentsname}{目录}     
\renewcommand{\indexname}{索引}
\renewcommand{\listfigurename}{插图目录}
\renewcommand{\listtablename}{表格目录}
\renewcommand{\figurename}{图}
\renewcommand{\tablename}{表}
\renewcommand{\appendixname}{附录}

%%%%设置chapter、section与subsection的格式%%%%
\titleformat{\chapter}{\centering\huge}{第\thechapter{}章}{1em}{\textbf}
\titleformat{\section}{\centering\LARGE}{\thesection}{1em}{\textbf}
\titleformat{\subsection}{\Large}{\thesubsection}{1em}{\textbf}
%%%%%%%%%%%%%%%%%%%%%%%%%中文重定义结束%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%一些个性设置%%%%%%%%%%%%%%%%%%%%%%
% \renewcommand{\baselinestretch}{1.3}     % 效果同\linespread{1.3}
% \pagenumbering{arabic}                   % 设定页码方式,包括arabic、roman等方式
% \sloppy                                  % 有时LaTeX无从断行,产生overfull的错误,
                                           % 这条命令降低LaTeX断行标准
\setlength{\parskip}{0.5\baselineskip}     % 设定段间距
\linespread{1.2}                           % 设定行距
\newcommand{\pozhehao}{\kern0.3ex\rule[0.8ex]{2em}{0.1ex}\kern0.3ex}
                                           % 中文破折号,据说来自清华模板

%%%%%%%%%%%%%%%%%%%%%%%%%个性设置结束%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%正文部分%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\setlength{\parindent}{2em}                   
% 设定首行缩进为2em。注意此设置一定要在document环境之中。
% 这可能与\setlength作用范围相关

\title{Ubuntu 9.04环境下\TeX 中文化配置}
\author{Lox Freeman}
\date{\today}

\maketitle

\tableofcontents

\newpage

\end{document}
%%%%%%%%%%%%%%%%%%%%%%%%%正文部分结束%%%%%%%%%%%%%%%%%%%%%% 




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee