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

GAS 汇编-1:起步

百度离职后,随着递归式学习的深入,我的涉猎从Lisp/Scheme/SICP,到APUE,最近又转入到了汇编语言上。老实说,汇编这种文物级的东西,在一般的计算机编程中是绝难碰到的。但是计算机工程学到一定层次,瓶颈所在,就会发现,总是有那么几样东西,诸如汇编、C、算法、编译原理、体系结构、操作系统、网络数据库等,这些基础知识绕不过,躲不开,而能否跨越这些坎,从某种意义上决定了一个程序员能否从合格到优秀、从优秀到卓越。

最早接触汇编还是在大一上一门计算机硬件基础的导论课上,我原以为这课既然叫计算机硬件基础,讲的应该都是软驱硬盘主板鼠标等如何拆卸组装选购的科普杂事。要知道,那个时候的我刚刚学会在Windows XP控制面板里面装卸软件。给我们讲课的是一个老头,用的是自己编写的教材。老头最津津乐道的事情是在90年代中期自己花了400块钱买了一个32M的U盘,却因为U盘容量太大而束手无策,不知道该存些啥东西。这课开始几次讲得确实是硬盘、鼠标组成科普原理啥的,后来讲着讲着就拐到了16bit DOS下的debug汇编编程,mov ax, bx这种,结果可想而知,我们全班同学一下子就晕的不行,弃考了一小半,剩余勉强坚持到最后的,又挂了好几个。

大二下又上了一门汇编语言的通识课,仍旧是16bit DOS,仍旧是不得要领。直到大三,上了专业的汇编课,硬着头皮,在Linux+Dosemu+masm5.0的环境下编了一个300多行的软件模拟浮点数算数指令的汇编程序,这才对16bit汇编中的一些基本概念诸如段、寻址方式、中断等等, 有了一个初步的了解。不过说实话,大学里的汇编学习和实际脱节太远,多数的汇编教育还停留在16bit DOS环境下,用得教材以清华的那本《IBM》居多,做得实验也都是Window 98DOS子系统下步进电机、控制电灯明暗这种实验,一到实际编程,32bit和64bit的保护模式下编程,加上复杂的MMX指令,浮点数指令,就傻眼了。

本文介绍Linux平台下32bit的GAS汇编语言编程,GAS是GCC编译器的汇编器。之所以采用这套工具,主要的原因在于GCC工具链非常成熟,GAS配合Emacs、GDB,加上Shell命令行,和objdump、od等工具,对于我这个Linux fans和命令行控有莫大的吸引力,工作效率自不必说,谁用谁知道。

x86汇编编程有两种截然不同的语法风格,我们常见的是Intel语法风格,类似这种:

mov eax, 32

而GAS汇编采用的是AT&T的语法风格:

movl $32, %eax

讲GAS汇编的书籍并不多,以下两本都是好书:

我粗略的看完了第一本,第二本正在进行中,这样的学习已经让我对C语言中很多高级的概念,诸如指针、编译连接过程、内存布局和分布有了比较深入的理解。

不过对于计算机的学习,光说不练是远远不够的。书本上看懂并不代表就能快速写出准确、实用、高效的程序来。我学习一门计算机语言,往往都会去找一本评价较好的书籍,把书上所有的示例代码看懂,自己亲自敲一遍。这不,刚刚起步,就碰到了两个小问题,记录下来,作为GAS汇编学习的起点。

首先是Emacs编辑器的问题。Emacs本身对汇编语言编辑功能的支持远比不上对其余高级编程语言的支持。一个内建的ASM Mode,乃是ESR的大作,粗略看了下,两百多行的代码,功能有限,要命的是还有个小bug,那就是默认的注释符号为';',而不是gas汇编接受的'#'。恰好这个月花费了大量精力研习了emacs manual和elisp manual,因此不自量力写了两个小函数,专门用于gas汇编语言的注释,(代码很初级,elisp高手轻拍):

(defun gas-comment-region (start end)
  "comment region for AT&T syntax assembly language
The default comment-char for gas is ';', we need '#' instead"
  (interactive "r")
  (setq end (copy-marker end t))
  (save-excursion
    (goto-char start)
    (while (< (point) end)
      (beginning-of-line)
      (insert "# ")
      (next-line))
    (goto-char end)))

(defun gas-uncomment-region (start end)
  "uncomment region for AT&T syntax assembly language
the inversion of gas-comment-region"
  (interactive "r")
  (setq end (copy-marker end t))
  (save-excursion
    (goto-char start)
    (while (< (point) end)
      (beginning-of-line)
      (if (equal (char-after) ?#)
          (delete-char 1))
      (next-line))
    (goto-char end)))

希望随着学习emacs和elisp的深入,自己能够写出一个稍微好一点的gas汇编的major-mode(顺便,前两天给emacs的包管理工具el-get提供了一rcp被接受了,这是我认真学习计算机以来第一次为开源项目做出点实际的贡献,开心)。

第二个问题是64位下写32位汇编程序的问题。这其中涉及到两个问题。其一是32位汇编和64位汇编的内在区别问题,包括语法层面上的,和机器层面上的,这个我还没有发言权,这里有一篇文档,详述了x86下64位汇编和32汇编的区别。而由于我上面提到的两本好书中,采用的都是32位的汇编,而32位向64位的迁移并不是无缝的,外加上我现在对64位汇编了解有限,因此如何在64位平台下编写、汇编、连接32位汇编,就是我们要解决的第二个问题。

要解决这个问题,就要对c程序的整个编译流程有一个稍微详细点的了解,光靠编译器点击一个按钮自动编译,是解决不了这个问题的。这个我不再具体展开,《程序员的自我修养》是这方面难得的一本好书,我粗略看过一遍,但一直不敢在豆瓣打上“看过”的标签,因为没有对计算机体系结构、汇编语言和C语言的深刻了解,是不可能深刻理解并“看过”此书的。

下面给出一个示例程序,来自于《Professional Assembly Language》

        .section .data
output:
        .asciz "The processor Vendor ID is '%s'\n"

        .section .bss
        .lcomm buffer, 12

        .section .text
        .globl _start
_start:
        movl $0, %eax
        cpuid
        movl $buffer, %edi
        movl %ebx, (%edi)
        movl %edx, 4(%edi)
        movl %ecx, 8(%edi)

        pushl $buffer
        pushl $output
        call printf

        addl $8, %esp

        movl $4, %eax
        movl $1, %ebx
        movl $output, %ecx
        movl $33, %edx
        int $0x80

        pushl $1
        call exit

这个程序很简单,主要是调用cpuid指令得到CPU本身的一些信息,然后调用C标准库中的函数打印出来,之后利用linux系统调用write打印出一个字符串,最后再次调用C标准库中的exit函数,状态码为1。我们来验证下此程序的编译、连接和运行过程,主要的汇编、连接指令是:

  • sudo pacman -S gcc-multilib binutils-multilib gcc-libs-multilib lib32-glibc
    • 安装必须的32位编译器和运行库
  • as -g -o cpuid2.o cpuid2.s –32
    • –32: 生成32位的.o文件
    • -g: 生成gdb调试信息,便于程序的调试
  • ld –dynamic-linker /lib/ld-linux.so.2 cpuid2.o -o cpuid2 -m elf_i386 -L/usr/lib32 -lc
    • –dynamic-linker /lib/ld-linux.so.2: 采用动态连接
    • -m elf_i386: 生成32位的程序
    • -L:讲lib32-glibc的库加入库搜索路径
    • -lc: 连接标准c语言库,printf必须
% uname -m 
x86_64
% as -g -o cpuid2.o cpuid2.s --32
% file cpuid2.o
cpuid2.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
% ld --dynamic-linker /lib/ld-linux.so.2  cpuid2.o -o cpuid2 -m elf_i386 -L/usr/lib32 -lc
% file cpuid2
cpuid2: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
% ./cpuid2 
The processor Vendor ID is 'GenuineIntel'
The processor Vendor ID is '%s'
% echo $?
1
% ls -l
total 24
drwxr-xr-x  2 lox users 4096 Mar 24 12:07 .
drwxr-xr-x 19 lox users 4096 Feb 29 20:08 ..
-rwxr-xr-x  1 lox users 2675 Mar 24 12:07 cpuid2
-rw-r--r--  1 lox users 1464 Mar 24 12:07 cpuid2.o
-rw-r--r--  1 lox users  414 Mar 23 18:18 cpuid2.s
-rw-r--r--  1 lox users  348 Mar 23 10:46 cpuid.s
% 

OK,就这么多,至于Makefile、gas程序调试等话题,容我后续再叙。

geek之趣

有计算机就有码农,有码农就会用geek。穿着内衣坐在电脑前,每天面对着“枯燥的代码”,一如既往,这就是常人眼里的geek形象。殊不知,geek们自由geek自己的乐趣。比如linux就是一个叫做linus的geek无聊时的作品。

断续使用linux两年不到,学艺不精,不懂系统管理、不知道网络安全、不知道啥叫路由器网关,倒是对linux下面的一些小东西颇感兴趣,翻来覆去地折腾。本文权且列举一二,如果能帮助读者窥探到开源精神的一二,那可真是善莫大焉了。

  1. fortune:这个程序可以用来
    • 算命
    • 提高英文水平
  2. git-shell:git是一种分布式版本控制系统,git-shell是git工具中的一个命令。可能我们第一眼看上去会觉得git-shell一定是一个git的命令环境,我们进入git-shell,然后就可以在这个环境下敲各种各样的git命令,git-shell之于git,就相当于shell至于linux一样。而事实上,我们在shell中敲入git-shell,得到的确是:“fatal: What do you think I am? A shell?”,这语气好像是linus怒气冲冲地在审问你:“你是不是没有好好学习我的git系统,才会犯如此的错误!?”。查阅git-shell命令的manual,才知道原来git-shell不是一个shell,而是一个“Restricted login shell for GIT-only SSH access”。
  3. man PK woman:如果你不知道一个命令的作用或者你忘记了ls命令的某个参数怎么办?显然,用“男人(man)”命令查看“男人页(manual)”就行了。与此相对,编辑器的老大哥emacs是一个self-documenting的系统,linux的info系统就是基于emacs风格的key binding,为了将广大的“男人页”收归自己囊下,emacs“针锋相对”的搞了个“女人”——woman,美其名曰“to browse Unix manual pages 'W.O. (without) man'”。至于“woman”的来龙去脉,大家自己去参看emacs内部的info文档即可,或者看这里
  4. ffmpeg, hall of shame:ffmpeg是linux下面一个著名的多媒体处理软件。可以用来进行格式转换,视频的crop、padding,剪裁,编解码等等。ffmpeg同时提供了一套优质的多媒体编解码库,而良好的编解码库是一个播放器的基础。linux下的很多播放器都和ffmepg项目有密切的配合和依赖关系。ffmpeg是遵循GPL协议的,但是很多播放器“无耻地”使用了ffmpeg的代码,却没有遵循GPL协议开放自己的代码,因此就上了ffmpeg的“耻辱柱”……What a Shame!
  5. The Matrix:你是不是以为shell就是用来敲击命令而vim是用来编辑文件的?你看国《The Matrix》吗?事实上就有这么几个“无聊透顶”的人,为了让自己cool一些,抽出些无聊的时间写了几个无聊的程序——cmatrix and vim matrix plugin。借用vim的广告词——“linux,字符也可以如此精彩”。
  6. sl:如果统计一下linux用户中最常用的10个命令,ls、cd肯定是榜上有名。借助shell的智能补全功能,或许我们敲命令的出错率反而会比超短命令(ls、cd)的出错率还要低。比如ls命令,我们一不小心敲了个sl,还没等shell的补全反应过来,我们已经大大方方的敲了Enter,彻底了解了这一怨念。结果往往是“command not found”的沮丧和无奈。而偏偏有geek闲来无事,将这种沮丧和无奈变成了小小的火车,载走你的烦恼,造福子孙后代,功德无量也。
  7. emacs doctor:代码敲累了?心情不好了?外边又打雷下雨啦?网络莫名断掉了?……最近倒霉事连串,心里不爽是吧——没关系,来看看emacs的心理医生吧,让它陪你聊聊,24小时陪聊,而且还是免费的!type "M-x doctor",enjoy it!
  8. gimp naming problem:from gimp FAQ():
    • Q: Why and when was GIMP changed from "general image manipulation program" to "GNU image manipulation program"?
    • A: One day (I believe it was in 1997) RMS visited Berkeley, and Spencer and Peter met with him. They asked if they could change General to GNU, and it was done.
    • Q: GIMP is a stupid name. Why can't you change it?
    • A: GIMP is comfortable with its name and thinks that you should apologise for your rudeness.
  9. GNU
    • Q: What is GNU?
    • A: GNU is Not Unix.
                          (@@) (  ) (@)  ( )  @@    ()    @     O     @     O      @
                     (   )
                 (@@@@)
              (    )

            (@@@)
          ====        ________                ___________
      _D _|  |_______/        \__I_I_____===__|_________|
       |(_)---  |   H\________/ |   |        =|___ ___|      _________________
       /     |  |   H  |  |     |   |         ||_| |_||     _|                \_____A
      |      |  |   H  |__--------------------| [___] |   =|                        |
      | ________|___H__/__|_____/[][]~\_______|       |   -|                        |
      |/ |   |-----------I_____I [][] []  D   |=======|____|________________________|_
    __/ =| o |=-~O=====O=====O=====O\ ____Y___________|__|__________________________|_
     |/-=|___|=    ||    ||    ||    |_____/~\___/          |_D__D__D_|  |_D__D__D_|
      \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/

放浪形骸之功,略有小成

这是3月25日晚上的照片。

首先是解决了emacs和ibus输入法冲突的问题,总结起来,大概原因有三:

一是系统环境变量LC_CTYPE设置错误,应该设置城zh_CN.UTF-8,下面是我的locale:

LANG=en_US.UTF-8
LC_CTYPE=zh_CN.UTF-8
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_COLLATE=en_US.UTF-8
LC_MONETARY=en_US.UTF-8
LC_MESSAGES=en_US.UTF-8
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=

二是没有设定好正确的ibus启动环境,应该在系统启动文件(如~/.xprofile, ~/.xinitrc等,看系统版本而定)中加入如下语句:

export XMODIFIERS="@im=ibus"
export GTK_IM_MODULE="ibus"
export QT_IM_MODULE="ibus"
ibus-daemon -x -d -r

三是字体问题。昨天出于系统洁癖原因,卸载了xorg-11,装上了xorg-server更精简的包,这么一卸一装少了几十款恐怕一辈子都用不到的字体。可是emacs却无法使用ibus输入法了。无奈,重新装上xorg-x11,重启后问题得到解决。

有的论坛说修改一下emacs中ctrl+space快捷键的设置。其实不对的。默认情况下xim快捷键的优先级应该比emacs的快捷键高,ctrl+space默认应该被x系统截取,调出ibus输入法的。

解决完了ibus的问题,晚上去zjg做实验,还是verilog,只是这次换了两台电脑,依然没有找到“成品”。无奈只得自己动手丰衣足食。好在照着前人的一份实验报告,折腾了良久,竟然成功了。三个仿真一个板载,运行成功。天,有史以来第一次靠着自己的力量搞懂了verilog代码完成了实验。不过xilinx还是比较恶心。bug不断,所谓下载到板子上究竟是怎么回事,鬼才知道。学生也就就着糊涂装糊涂,copy来copy去,索然无味。不过好好学还是有收获的,逻辑,组成加体系结构,三门理论碰上三门实验,抵得上国外大学体系结构的真家伙了。

无奈做完实验已经没有公交了,等校车又得等半个小时,给某人打电话,心境不佳,索性走回yq。十三公里左右,从9点半走到11点半。

路上碰见一家超市,遂进去拿了凭雪花,勇闯天涯,心情舒畅,大快。边走边饮,边饮边唱,边唱边笑,放浪形骸。爽也。路上短信和wj大谈linux发展之路,指点江山,激昂文字,好不快活。

晚上回寝,随便逛了逛论坛,倒头便睡。至日照三杆,吃过午饭,步行至图书馆。一个下午,看了两章《Linux Administration Handbook》,搞定了zhq社团的文案,还写了一篇煽情的文字给两位同志,ms很有效果。

9点回寝,执笔给高中老师写了一封信,兑现自己之前的一个承诺,总结了下自己的过去,展望下未来。mm说,“是否工作疲惫,生活劳累,这时候停下脚步,回头看看自己走过的路,又会充满前行的动力”。也对的。明天早起写完两天报告,补补课。后天去zjg做一个单车入门讲座。实验室学长给我短信,说有个项目,需要连续奋斗二十天,问我是否有意。我还在犹豫,恐怕不得安排。要看的lpi,要补的课,要刷的zoj题目,反正,总算进入学期正轨了。

加油吧。奋斗的日子。再这样下去,每天日照三杆,恐怕不行。以后恐怕要以实验室和图书馆为家了。Knuth说,程序就像蓝色的诗歌,本人东施效颦,以代码格式贴上这首歌:

《我们都站在雨中》---- 《连城诀》主题曲

把双眼紧闭,剑要往哪里刺去
谁说秋风最能懂落叶思绪
致命的一击,真的对手是自己
只剩下了无声的叹息

酒逢知己,千杯也难尽兴
英雄醉了也一样会慢慢倒下去
望星辰转移,江湖又下起暴雨
我们都站在雨里
穿过刀光剑影之后,我还是那个我
只是把受伤的心独自对着明月说
天涯的尽头有没有一处安静的角落
让浪迹的人在走累的时候躲一躲

安。

终于搞定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}
%%%%%%%%%%%%%%%%%%%%%%%%%正文部分结束%%%%%%%%%%%%%%%%%%%%%% 

最近看的一些书

8月10日回家带了四本书,但是一本没看,看的全部都是电子书,如下:

  1. 《How to Do Every Thing with HTML》
  2. 基本看完,重温并巩固了HTML的绝大部分知识,初步领略CSS的风范,对 Javascript,DHTML有了感性的了解。看这部分主要是为了旅行者小网站的建 设做一下充分的准备工作。
  3. 《Advanced Bash Scripting Guide》
  4. 暑假Linux短学期让我领略到了Bash编程的魅力。虽然这本书厚达800多页,而 我只看完了4章60多页,但是这本书难度不是很高,应该能在两周之内搞定的。 前提是得多练习啊。
  5. 《LPIC-1: Linux Professional Institue Certification Study Guide》
  6. 打算考LPI了。虽然每级考试2600的考试费让我很是心疼,也会让我时刻鞭策 自己好好看书。找工作么,无非就是那么几回事儿,出身、成绩、英语、专业 技能、社会实践、项目经验、实习经验。
  7. 《PHP Manual》
  8. 用dwww看的本地html版本。看完了Language Reference的大部分。感觉php就 是C和Bash的结合体,语法绝大部分借鉴C和C++,变量借鉴Bash,掌握其精髓,剩 下的数据库接口,图像处理等等,就靠实践了。

一些问题和期待:

  1. xetex 0.997 in ubuntu
  2. 自己配置的LaTeX+CJK环境用的比较顺手了,但是很不爽的一点是生成的pdf书 签是乱码。开始我以为是evince的问题,后来拿到windows平台上用Adobe Reader打开也是乱码。CTeX论坛说有个gbk2uni的程序处理一下就行,但是我 没有成功。于是我开始寻求xetex的解决方案。但是,问题又来了,单纯的 xetex可以解决书签乱码问题,但是需要配上XeCJK,才能达到完美的排版效 果,偏偏XeCJK的最低版本要求是0.997而我的Ubuntu9.04上的xetex却是0.996 版本。于是我郁闷了,只能先LaTeX+CJK凑合用吧。期待Ubuntu9.10中能有所 改进。
  3. 旅行者手册
    本来打算8月底完工的,但是真正做起来才发现工作量之大。手册打算以pdf、 html、doc三种格式发行。为了保持文档的一致性,当初设想了三个方案:
    • docbook
    • docbook已经成为技术文档撰写事实上的标准。但是一来docbook写起来比较 麻烦;二来对中文支持不太好;三来我看了几个docbook做出来的东西实在 不怎么好看,毕竟是用来写技术文档的;四来我还不怎么会用docbook。所 以此方案暂时不可行。
    • LaTeX+tth
      1. LaTeX中文书签乱码问题
      2. 格式转换问题
    • LaTeX的排版效果自不必说。问题在于: tth是个很优秀的软件。支持绝大部分的LaTeX环境,转换出来的html文档相 当完美,并且支持中文。通过html再转换成doc,也只不过是一盏茶的功夫。 但是tth转换出来的文档略显单调,而且是长长的一整篇,我琢磨这我这预 算在100多页的文档转换成一页html文档,估计对看客是个考验。虽然可以 事后重组,排版,但终究是很麻烦的一件事情。
    • Emacs+Muse
    • 想来想去还是回到了Emacs+Muse的解决方案上。配上一定的CSS,完美的 html输出,然后输出LaTeX文件整合一下,套上个中文CJK的模板,基本上可 以解决问题。不过Muse会自动加上一些烦人的超连接,目前的解决方案就是 利用Emacs的query-replace-regexp手工解决。当然也Baidu过sed、awk和 perl,以后再学。

OK,继续CSS。




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