用Latex写漂亮的论文

2009年3月30日星期一

0 评论  

一直觉得有必要写这样一篇文章,因为学位论文从格式上说更像一本书,与文章 的排版不同,不仅多出目录等文章没有的部分,而且一般要设置页眉页脚方便阅 读查找。学校有时会提出具体的格式要求,虽然复旦的要求非常简单,而且事实 上并不严格执行,但自己的论文毕竟是自己的孩子,还是要敝帚自珍的,大家都 希望做得漂亮一点。

网上已经有不少学位论文的模板,其中大都出自一两个最初的版本,针对各自学 校的要求作了一些改动。这些模板还是很方便的,如果对它们的排版效果感到完 全满意,那么直接拿来用就可以了。不过如果想调整其中某些格式,就不得不仔 细研究一下它们的代码或说明文档,有时并不那么容易。而且这些模板的导言或 cls或sty文件都写得很长,内容很多,尽可能的包含了大家有可能用到的功能, 但其实具体到每个人只有一部分是需要用到的。用一个包含"冗余"代码的模板, 总不是一件很舒服的事情。当然也许很多人抱着能用就好的态度,并不care。:)

本文是为那些对论文格式有特殊要求或喜欢自己设置格式的人写的。如果你觉得 网上能找到的论文模板已经足以满足你的需要,并且对TeX本身也没有多少兴趣, 那么你没有必要花费宝贵的时间阅读本文。

阅读本文的基础是假定你已经了解怎样用LaTeX来写普通的文章。一般的 TeX/LaTeX命令不会再作解释,重点将放在学位论文与普通文章的不同点上,以及 怎样用一些宏包方便地设置其格式。其中大部分内容来源于网络资源、工具书以 及各个宏包的说明文档,恕不一一注明,在此一并致谢!

首先讲一下纸张大小和页边距的设置。根据复旦的格式要求,纸张大小为A4纸, 正文用小四号字,页边距按Word中的默认设置。小四号字即12pt, Word中默认的 页边距为

上边距=2.54cm, 下边距=2.54cm, 左边距=3.17cm, 右边距=3.17cm

或者换算成更容易记忆的

上边距=1in, 下边距=1in, 左边距=1.25in, 右边距=1.25in

如果我们用book类,第一句可以写

\documentclass[a4paper,12pt]{book}

然后用geometry宏包设置页边距

\usepackage[top=1in,bottom=1in,left=1.25in,right=1.25in]{geometry}

但其实这样设置的页边距极不美观,尤其是左右对称的页边距没有考虑装订的需 要,而且加上页眉后这样的上边距就显得过窄。所以注重美观的话还是自己调整 一下吧。

需要注意的是,book类默认是twoside即双面打印模式,与article类默认的 oneside即单面打印模式不同。两者区别在于页边距和页码的位置。单面模式每页 的页边距都相同,双面模式则会在偶数页将设置的左、右页边距调换。如果采用 单面打印,则可在\documentclass的方括号里加上oneside参数,并在geometry的 选项中适当增加左边距,减少右边距,以留出装订线的位置。但是不要忘了装订 的时候右侧一般会裁掉一点边,所以左、右边距也不要相差过大。如果采用双面 打印,则geometry中的设置被解释为奇数页的页边距,偶数页的左、右边距会自 动互换。

还有几个注意事项。首先,这里的奇数页和偶数页是针对当前page计数器的值来 说的,而不是在生成文件中总的页码。也就是说,假如当前页在整个输出中总排 序是偶数页,但当前page计数器(即显示的页码)为奇数,则当前页的页边距是按 奇数页设置的。

其次,\documentclass还有一对选项openright和openany, book类默认是前者, 即每一章(包括目录)都会在奇数页开始,如果前一章的最后一页是奇数页,则会 在其后插入一页空白页,以确保新的一章仍然从奇数页开始。这是书籍的排版规 范,不建议改变,论文页数比较少的还可以借此增加页数。:)这是双面模式的情 况,在单面模式下不存在这个问题。经常有人问为什么自己明明是单面打印,却 仍然会在两章之间有一页空白页,请注意book类默认是双面模式,除非你设为 oneside, 记住告诉TeX你要的是什么!

另外,为了方便查看,页码应该放在书籍的外侧。对于单面模式,外侧就是右 侧,而对于双面模式,奇数页右侧是外侧,偶数页左侧是外侧。如何设置页码留 到后面讲设置页眉、页脚时再详细说。

至于到底是单面打印还是双面打印,看你自己的喜好了。复旦的论文规范没说, 一般的做法是博士双面、硕士单面。反正总页数少于50页的话,就不要双面了, 否则显得太单薄,书脊的内容都很难打印。

最后提一个常见的问题。如果用pdf文件来打印,在Acrobat的打印对话框里有一 项Page Scaling默认是Fit to paper, 这样打印出来整个内容就会缩小一些,不 再是设置的尺寸。这是因为打印机的可打印范围不能达到整个A4纸张的全部,而 是比A4纸的规格要小一些(具体的可打印范围跟打印机型号有关), Fit to paper 的意思就是把整个页面调整到可打印范围上去,以保证所有页面上的内容都能打 印出来。因为可打印范围总是小于A4纸的尺寸,所以打印出来总是会缩小一些。 缩小的比例一般为95%左右,与打印机型号有关。解决这个问题,只要选择Page Scaling为None就可以了。

这一节讲中文字体和中英文混排的问题。中文处理推荐使用CJK或新版CCT, 旧版 CCT因为年代久远,有一些bug会导致莫名其妙的问题,不建议再使用。本文以 CJK为例,中文环境为

\begin{CJK*}{GBK}{song}
...
\end{CJK*}

与英文习惯不同,中文排版一般没有粗体的概念,而是用宋体、黑体、楷体、仿 宋等不同的字体来加强文本效果。在CJK默认的字体定义文件中,宋体对应的粗体 是用\CJKbold 命令通过微小平移字形来实现的,不仅放大后能看到锯齿,而且也 不符合中文的排版习惯。建议将宋体对应的粗体设为黑体,这样文中所有粗体命 令作用的环境中加粗的宋体都会自动变成黑体,不需要再用\CJKfamily{hei}来转 换。

宋体的字体定义文件C19song.fd里典型的一段代码如下

\DeclareFontFamily{C19}{song}{}
\DeclareFontShape{C19}{song}{m}{n}{<-> CJK * gbksong}{}
\DeclareFontShape{C19}{song}{bx}{n}{<-> CJKb * gbksong}{\CJKbold}
\DeclareFontShape{C19}{song}{m}{it}{<-> CJK * gbksongsl}{}
\DeclareFontShape{C19}{song}{bx}{it}{<-> CJKb * gbksongsl}{\CJKbold}
\DeclareFontShape{C19}{song}{m}{sl}{<-> CJK * gbksongsl}{}
\DeclareFontShape{C19}{song}{bx}{sl}{<-> CJKb * gbksongsl}{\CJKbold}

这里C19代表GBK字符集的编码方式,m表示字符的粗细程度和宽紧程度均为中等 (medium), bx表示字符的属性为粗(bold)和松(expanded), n, it和sl分别表示正 常直立体(normal), 意大利斜体(italic)和机械斜体(slanted)。 \DeclareFontShape的最后两个参数分别是字体定义和命令序列。显然,上述语句 将宋体的粗体定义为用\CJKbold 生成。要将其改为黑体,只需将这段代码改为

\DeclareFontFamily{C19}{song}{}
\DeclareFontShape{C19}{song}{m}{n}{<-> CJK * gbksong}{}
\DeclareFontShape{C19}{song}{bx}{n}{<-> CJKb * gbkhei}{}
\DeclareFontShape{C19}{song}{m}{it}{<-> CJK * gbksongsl}{}
\DeclareFontShape{C19}{song}{bx}{it}{<-> CJKb * gbkheisl}{}
\DeclareFontShape{C19}{song}{m}{sl}{<-> CJK * gbksongsl}{}
\DeclareFontShape{C19}{song}{bx}{sl}{<-> CJKb * gbkheisl}{}

实际上,正式的中文排版也不应使用斜体,而应使用楷体或仿宋代替。所以也可 以类似地将上述语句中的gbksongsl改为gbkkai或gbkfs。

上述字体定义命令可以放在sty文件中(设保存文件名为thesis.sty, 则在导言区 用\usepackage{thesis}引用,后面所述的大部分命令也都可以放在sty文件中), 而不需要更改本地机器上的fd文件,以便在别的机器上也能产生同样的效果。

另外,为了方便可以定义几个简短的字体转换命令

\newcommand{\song}{\CJKfamily{song}}
\newcommand{\hei}{\CJKfamily{hei}}
\newcommand{\kai}{\CJKfamily{kai}}
\newcommand{\fs}{\CJKfamily{fs}}

以后就可以用\song, \hei, \kai和\fs在文中转换字体了。

在用\begin{CJK*}{GBK}{song}开始中文环境后,应加上\CJKindent和\CJKtilde 两句。前者将段首缩进设为两个中文字符的宽度。后者则是为了解决中英文混排 的美观问题。CJK*环境会吞掉跟在汉字后面的空格,从而使得源文件中的换行不 会在相邻汉字之间产生空白。但是这样一来,像下面这样输入的中英文内容

中文 abc 中文

就会产生如下效果

中文abc 中文

即abc两侧的空白不一样,很不美观。为解决这个问题,\CJKtilde重新定义了波 浪符~的意义,使得这个符号不再代表一个不可断行的空格,而是一个可断行的弹 性距离,加在中文和英文之间调整它们的距离。上面的中英文内容应该这样输入

中文~abc~中文

就能得到良好的效果。这个输入方式最好一开始就形成习惯,否则后来再加会很 麻烦。当然你也可以这样输入

中文abc中文

这样的话虽然中英文之间的距离太窄,但至少左右对称,比上述第一种方式略 好,是偷懒的办法。不过如果你比较在意排版质量的话,还是忍受一下输入~的麻 烦吧。

中英文混排有一些标点的问题要处理好。首先是在默认的CJK环境里,行末的中文 标点不能与边界对齐,因为中文标点也被视为一个普通的全角字符,所以看起来 行末就有了不应该有的空白,这不符合中文的排版习惯。另外,当一行文字需要 压缩或拉伸时,逗号与句号也应该区别对待,逗号后面留的空白应该比句号小一 些。这两个问题用CJKpunct 宏包就能很好地解决,只要加上 \usepackage{CJKpunct}即可。

此外,中英文混排的时候是用中文标点还是英文标点呢?这并没有统一的规范。 不过比较合理也比较通行的做法是,中文后用中文标点,英文后用英文标点。比 较特殊的两个标点是句号和括号。一般数学文章习惯用全角的实心句点作为中文 句号,这样看起来与英文的句号比较一致。全角的中文括号看起来不太好看,可 以统一使用英文的括号,不过左括号前面和右括号后面最好加上波浪符~以和前后 的文字留出适当的距离。

上面说的这几点也许比较琐碎,不过也正是最能看出是否精心排版的地方。

下面几节讲怎样用titlesec和titletoc宏包设置章节标题、页眉页脚和目录的格 式。设置页眉页脚有一个很有名的宏包fancyhdr也可以用,不过titlesec提供的 页面设计命令更方便与它的章节标题命令配合,功能更强大。这一节先讲章节标 题格式的设置。

在引用titlesec宏包时就可以指定几个格式选项,例如

\usepackage[bf,small,center,indentafter,pagestyles]{titlesec}

其中bf设置章节标题的字体为黑体,这也是默认值,可以略去。此外,还可以设 为rm(罗马体), sf(无衬线体), tt(打字机体), md(中等黑度), up(直立体), it(意大利斜体), sl(机械斜体), sc(小体大写字母)。

small设置标题字体的尺寸,还可设为big(默认), medium, tiny。

center使标题居中,还可以设为raggedleft(居左,默认), raggedright(居右)。

indentafter相当于宏包indentfirst的作用,使标题下面的第一个段落正常缩进。

pagestyles是申明后面要自定义页面样式。

下面就可以用\titleformat, \titlespacing, \titlelabel等命令来设置标题格 式了。因为这些命令里会用到中文,所以要在设置之前放一个空的CJK环境,如

\begin{CJK*}{GBK}{song}
\end{CJK*}

下面的\titleformat命令设置了章标题的格式

\titleformat{\chapter}[hang]{\centering\LARGE\bfseries}{\chaptername}{1em}{}

其中\chapter可以换为\section, \subsection等,设置节、小节等标题的格式。

hang表示标题头与标题内容在同一行,是默认值。而book类默认的章标题是标题 头与标题内容放在两个段落,对应于display选项。此外还有block, runin, leftmargin, rightmargin, frame, wrap等选项,一般不大用到。

\centering\LARGE\bfseries这一块是设置标题的排版格式,这里设置为居中、 \LARGE尺寸和黑体。

后面紧跟的是标题头的定义。book类里的标题头是英文,需要改成中文。如果希 望改成"第一章"这样的格式,则应先引用CJKnumb宏包,它提供了把阿拉伯数字转 换成中文数字的命令。然后定义

\renewcommand{\chaptername}{第\CJKnumber{\thechapter}章}

那么\titleformat里的标题头定义\chaptername就得到我们希望的效果。当然你 也可以不用中文数字而用阿拉伯数字,即定义

\renewcommand{\chaptername}{第~\thechapter~章}

跟在标题头定义后面的是标题头与标题内容之间的距离,这里是1em。注意,在中 文环境里1em等于一个汉字的宽度。

最后一个花括号内是在排版标题前执行的命令,这里空置。

然后用\titlespacing或\titlespacing*命令设置标题与四周的距离,例如

\titlespacing{\chapter}{0pt}{*0}{*4}

将章标题与左边、上边、下边内容的距离分别设为0pt, *0, *4。这里*n表示弹性 距离,对上距离来说相当于n ex plus .3ex minus .06ex, 对下距离来说相当于 n ex plus .1ex。弹性距离因为有一定的伸缩自由度,比较容易得到美观的排版。 如果想自己指定用关键字plus, minus定义的弹性距离,可以用星号版本的命令, 即

\titlespacing*{命令}{左距离}{上距离}{下距离}

上面设置了章标题的命令,用相同的命令也可以设置节、小节等的标题格式。但 如果没有特殊的要求,只希望修改一下标题头,可以用更加简单的命令 \titlelabel来设置。例如

\titlelabel{\S\thetitle\quad}

将章节标题设置为类似"§1 标题内容"的格式。这里\quad等于\hspace{1em}, 即 空出一个汉字宽度的距离。注意,\titleformat命令的定义会覆盖\titlelabel的 定义,而一般来说章跟节标题的格式不一样,所以只要另外用\titleformat命令 定义章标题的格式,\titlelabel的定义就只能作用于节以下层次的标题了。

这一节接着讲怎样用titlesec宏包提供的命令设置页眉、页脚。下面命令定义了 一个新的页面样式并使用该样式

\newpagestyle{main}{
\sethead{}{}{\kai\small\chaptername\quad\chaptertitle\qquad\thepage}
\setfoot{}{}{}\headrule}
\pagestyle{main}

其中\sethead命令设置页眉,格式为

\sethead[偶数页左页眉][偶数页中页眉][偶数页右页眉]
{奇数页左页眉}{奇数页中页眉}{奇数页右页眉}

单面打印模式只要给出奇数页的设置即可,双面模式则需要将左、右页眉做个调 换。上面给出的例子是单面模式的。

\setfoot用来设置页脚,格式与\sethead类似。

在页眉、页脚里可以显示章节标题、页码等内容。如上面的例子就在页眉中显示 了章标题和页码。注意,\qquad相当于两个\quad, 即\hspace{2em}。

\headrule是划出页眉线,类似地\footrule划出页脚线,不过比较少用。默认页 眉线的宽度是0.4pt, 如果不满意,可以用下面命令重新设置其宽度

\setheadrule{宽度}

此外,还有两种特殊情况需要处理。首先,尽管在上面例子中用 \pagestyle{main}使用了自定义的页面样式,但每一章的第一页不受影响,仍然 使用默认的plain样式。在这种页面上,出于美观的考虑,一般不加页眉,而将页 码放在页脚(也有人喜欢不加页码)。所以plain样式(没有页眉,页码放在页脚中 间)已经基本符合要求,不必修改。如果需要修改,可定义一个新的页面样式,再 用下面命令重定义plain样式

\renewpagestyle{plain}{新的页面样式}

其次,在目录、参考文献或以\chapter*命令生成的章,上面页眉定义中的标题头 \chaptername是不应该显示的。所以有必要定义一个页面样式在这种特殊的章使 用,例如可以定义

\newpagestyle{special}{
\sethead{}{}{\kai\small\chaptertitle\qquad\thepage}
\setfoot{}{}{}\headrule}

然后在文中适当的地方用\pagestyle{special}改用该样式。

目录是学位论文的必要组成部分。只要在正文中适当的地方用

\tableofcontents

就可以自动生成目录。但是目录的格式不总是符合个人的要求,有时还要往其中 加一些条目。用titletoc宏包提供的命令可以方便地设置目录的格式。

首先可以用

\renewcommand{\contentsname}{目\quad 录}

将目录部分的标题改为中文。然后,用\titlecontents命令来设置不同级别目录 项的格式。例如,chapter层次的目录项格式可设置如下

\titlecontents{chapter}[0pt]{\vspace{.5\baselineskip}\bfseries}
{第\CJKnumber{\thecontentslabel}章\quad}{}
{\hspace{.5em}\titlerule*[10pt]{$\cdot$}\contentspage}

其中0pt是目录项到版芯左边界的距离。紧跟其后的是在排版目录项之前执行的命 令,这里\vspace{.5\baselineskip}表示与上文留出一定的垂直距离,该距离为 当前单倍行间距的一半。\bfseries把整条目录项的字体设为黑体。

后面一项是设置目录项的头部,这里设为"第一章"这样的格式,并在其后留出一 个汉字宽度的距离。紧跟的是设置目录项主体的格式,这里因为跟目录项头部相 同而空置。

再后面是设置填充命令和页码。这里先用\hspace{.5em}在目录项内容后面留出一 点空白,以免跟其后的填充点靠得太近。然后用\titlerule*命令画出填充点,这 里是把垂直居中的实心圆点作为填充符号(习惯上中文不采用居下的填充点), 并 以10pt为包含一个填充符号的水平盒子的宽度,即这个宽度越小,填充点越紧密。 填充点后加上页码\contentspage。

类似地可以设置section层次的目录项格式如下

\titlecontents{section}[2em]{\vspace{.25\baselineskip}}
{\S\thecontentslabel\quad}{}
{\hspace{.5em}\titlerule*[10pt]{$\cdot$}\contentspage}

其中2em表示section层次的目录项距左边界有一个缩进。如果还有subsection等 层次,可以类似地定义。

但是\chapter*, \section*等命令生成的标题不会自动进入目录中。例如中文摘 要部分如果用下面命令开始

\chapter*{摘\quad 要}

那么可以紧跟其后加上

\addcontentsline{toc}{chapter}{中文摘要}

就可以将中文摘要作为一个chapter层次插入目录中。英文摘要、参考文献部分均 可照此处理。随便提一下,参考文献部分的标题可用如下命令改为中文

\renewcommand{\bibname}{参考文献}

这一节讲前几节尚未提到的一些文本排版问题。

首先是行间距的设置。学校的学位论文规范中提到行间距为20pt。其实不同尺寸 的字体行间距都不相同,而是成比例关系。这个20pt是对正文主要字体来说的。 在TeX中基本的行间距是\baselineskip, 对于12pt的字体,这个值等于14.5pt, 而真正的行间距是

\baselineskip * \baselinestretch

\baselinestretch默认为1, 但我们可以重新设置它的值,如

\renewcommand{\baselinestretch}{1.38}

就得到真正的行间距为14.5pt*1.38≈20pt。而这样定义之后,对不同尺寸的字体 都会按同样的比例因子1.38放大行间距,使得全文排版能协调一致。

那么\baselineskip的值是怎么知道的呢?在TeX源文件中加上命令

\showthe\baselineskip

编译时就会暂停下来显示当前字体的\baselineskip值。用这个方法可以知 道,10pt字体对应的\baselineskip为12pt, 11pt字体对应的\baselineskip为 13.6pt。

至于通常所说的1.5倍行间距和双倍行间距,一般理解为字体基准尺寸的1.5倍和 2倍,例如对于12pt字体, 1.5倍行间距和双倍行间距分别应为12pt*1.5=18pt, 12pt*2=24pt。那么\baselinestretch分别应设为18pt/14.5pt≈1.24, 24pt/14.5≈1.66, 而不是1.5和2, 那样的话行间距就会显得过大了。

然后讲一下论文首页的设置。复旦的学位论文,装订的地方会按学校的模板制作 封面,就不用自己做了,不过规范中要求在扉页注明指导小组成员名单,并且为 了保持论文电子版的完整性,最好还是做一个简单的论文首页(标题页)。

没有必要用\title, \author和\maketitle等命令自动生成论文的标题,因为那可 能不太符合你的要求。只要用

\begin{titlepage}
标题页内容
\end{titlepage}

在标题页内容中用上一些center环境、\vspace*和字体选择命令就可以很容易地 设计出自己想要的格式了。

注意,上述标题页是没有页码的。而一般正文之前的部分,包括目录、摘要等, 习惯上采用与正文部分不同的页码格式,如用罗马数字表示,而从正文第一页开 始用阿拉伯数字重新开始计算页码。要做到这一点,只要在标题页后加上

\frontmatter 或 \pagenumbering{roman}

并在正文第一章前加上

\mainmatter 或 \pagenumbering{arabic}

就可以了。但是推荐使用\frontmatter和\mainmatter, 因为这两个命令的用处不 仅限于此。前面说过,像中文摘要这种非正文的部分,可以用\chapter*命令加 入,但当设置了页眉后就会发现一个问题,页眉中的\chaptertitle没有同步更新。 要解决这个问题,一个办法是在\chapter*命令后加上一句\chaptermark, 例如

\chapter*{摘\quad 要}\chaptermark{摘\quad 要}

但假如我们使用了\frontmatter, \mainmatter以及与其配套的\backmatter, 就 不需要这么麻烦,只要直接用不带星号版本的\chapter命令就可以了,对于 \frontmatter与\mainmatter之间的部分,以及\backmatter之后的部分,系统就 会自动地跟正文部分的章区别开来,不加上"第一章"这样的章标题头。一个典型 的文档结构示例如下

\begin{document}

\begin{titlepage}
标题页内容
\end{titlepage}

\frontmatter % 开始正文之前的部分
\tableofcontents % 自动生成目录

\chapter[中文摘要]{摘\quad 要}
% 方括号中是在目录中显示的内容,相当于前面使用的\addcontentsline
中文摘要内容

\chapter[英文摘要]{Abstract}
英文摘要内容

\mainmatter % 开始正文部分
\chapter{第一章标题}
第一章内容

\backmatter % 开始正文之后的部分
\begin{thebibliography}{99}\addcontentsline{toc}{chapter}{参考文献}
参考文献内容
\end{thebibliography}

\chapter[致谢]{致\quad 谢}
致谢内容

\end{document}

到这里文本排版讲得差不多了。这一节再讲讲定理和证明环境的格式设置。

数学论文里经常使用大量的定理环境。LaTeX默认的定理环境已经不能满足要 求,amsthm 宏包提供了方便的命令用于设置定理环境的格式。例如下面的命令定 义了一个定理样式mythm, 并用它来定义一些常用的定理环境

\newtheoremstyle{mythm}{1.5ex plus 1ex minus .2ex}{1.5ex plus 1ex minus .2ex}
{\kai}{\parindent}{\song\bfseries}{}{1em}{}
\theoremstyle{mythm}
\newtheorem{thm}{定理~}
\newtheorem{lem}{引理~}
\newtheorem{prop}{命题~}
\newtheorem{cor}{推论~}
\newtheorem{defn}{定义~}
\newtheorem{conj}{猜想~}
\newtheorem{exmp}{例~}
\newtheorem{rem}{注~}

我们解释一下\newtheoremstyle命令里各项参数的意义。样式名称之后的两个长 度分别表示定理与上、下文之间的距离,这里均设为弹性距离。\kai是设置定理 内容的字体。\parindent是设置定理首行的缩进,在前面使用了\CJKindent的情 况下,它就等于2em。

紧随其后的\song\bfseries是设置定理头部即类似"定理 1"部分的格式,一般中 文使用黑体。因为我们在前面已经将宋体对应的粗体定义为黑体,所以这里将中 文字体设为宋体,再用选择粗体命令\bfseries, 就同时把中文变为黑体,英文变 为粗体了。注意,如果前面没有修改字体定义文件,而在这里用\hei改变字体, 再加上\bfseries就很可能会造成"黑上加黑"即黑体的加粗,这种拙劣的文本效果 是不应该出现的。

这之后的参数是设置紧跟定理头部的符号,英文中常设为一句点,而中文习惯不 加任何符号,所以这里空置。然后是设置定理头部与定理内容之间的空白距离, 这里设为1em, 即一个汉字的宽度。

最后一项是对定理头部的补充说明,这里空置。但如果我们希望得到类似"定理 1 (存在性定理)"这样的定理头部,那么可以再定义一种定理样式

\newtheoremstyle{specthm}{1.5ex plus 1ex minus .2ex}{1.5ex plus 1ex minus 
.2ex}{\kai}{\parindent}{\song\bfseries}{}{1em}{\thmnote{#3}}

这里最后一项\thmnote{#3}表示用方括号中的附加内容作为定理头部。用此样式 定义一个新的定理环境(与前面定义过的thm环境统一编号)

\theoremstyle{specthm}
\newtheorem{sthm}[thm]{}

并在正文中使用

\begin{sthm}[定理~\thethm~(存在性定理)]
定理内容
\end{sthm}

就得到了想要的效果。

至于证明的排版,amsthm宏包提供了proof环境,但格式需要做一点调整。 amsthm.sty中对proof环境的定义如下

\newenvironment{proof}[1][\proofname]{\par
\pushQED{\qed}%
\normalfont \topsep6\p@\@plus6\p@\relax
\trivlist
\item[\hskip\labelsep
\itshape
#1\@addpunct{.}]\ignorespaces
}{%
\popQED\endtrivlist\@endpefalse
}

为了符合一般中文证明环境的排版习惯,可以重新定义proof环境为(注意,因为 这些命令含有@字符,所以需要在前、后分别加上\makeatletter和 \makeatother)

\makeatletter
\renewenvironment{proof}[1][\proofname]{\par
\pushQED{\qed}%
\normalfont \topsep6\p@\@plus6\p@ \labelsep1em\relax
\trivlist
\item[\hskip\labelsep\indent
\bfseries #1]\ignorespaces
}{%
\popQED\endtrivlist\@endpefalse
}
\makeatother

并且重新定义\proofname为

\renewcommand{\proofname}{证明}

proof环境会自动在证明最后一行的最右边加上一个证明结束符,默认为空心方 块,可以重新定义\qedsymbol来修改它。需要注意的是,当证明以一个独立公式 结束时,证明结束符会出现在下一行的最右边,而不是在公式的同一行上,这不 合乎习惯。这时只要在公式环境内加上\qedhere即可。

最后还要讲讲浮动图形和表格环境的中文化。首先把Figure和Table改为中文

\renewcommand{\figurename}{图}
\renewcommand{\tablename}{表}

然后需要对浮动环境的标题格式做一点修改。在book.cls中可以找到如下定义

\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{#1: #2}%
\ifdim \wd\@tempboxa >\hsize
#1: #2\par
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip}

这段代码包括了一个判断选择结构,如果标题超过一行则直接显示,否则在一行 内居中显示。可以不理会这个,只要根据自己的格式要求修改#1(即\figurename 或\tablename) 和#2(标题内容)的格式,以及#1与#2之间的分隔符。例如,如果 希望把#1改为黑体,并把分隔符改为一个空格,可以这样设置

\makeatletter
\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{{\bfseries #1}\quad #2}%
\ifdim \wd\@tempboxa >\hsize
{\bfseries #1}\quad #2\par
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip}
\makeatother

★★★结束语★★★

到这里,每个人都需要知道的东西已经基本上介绍完了。如果你仔细读了这些文 字,并且按照它去设置了你的论文格式,我想应该差不多了。当然,不同学科的 论文有各自的特点和要求,肯定还有很多具体的问题没有涉及。例如计算机专业 的可能经常要用到代码抄录环境,文科的论文可能要使用章末注,等等。这些问 题也是版上经常问到的,在本版精华区中大都能找到解答,这里就不再赘述。

希望费了不少时间写的这些东西能对大家有所帮助。最后,祝大家TeX越用越熟 练,都能写出漂亮的论文!

Opensuse下latex配置中文环境步骤及注意事项

2009年3月29日星期日

0 评论  

第一步,安装latex,可以选择很多版本。
如文中所说的,texlive。

当然其它还有很多,没有试用过......

来自王越主页(安装texlive完整版):
http://mailboxpublic.googlepages.com/texlive2007cjkchinesehowto

方法一. Install TeXLive
_________________
First, install TeXLive.

wget ftp://ftp.tsinghua.edu.cn/mirror/CTAN/systems/texlive/Images/texlive2007-live-20070212.iso.zip
unzip texlive2007-live-20070212.iso.zip
mount -o loop texlive2007-live-20070212.iso /mnt
cd /mnt
sudo ./install-tl
press I to install.

Setup System Path
_________________
Set the path. Take debian GNU/Linux as example, modify your /etc/environment like this and make a reboot:

PATH="/usr/local/texlive/2007/bin/i386-linux:/usr/local/matlab/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games"


方法二 打开终端,执行下述命令安装TexLive和常用的一些Latex宏包(可以根据自己的需要增改):

sudo apt-get install texlive texlive-math-extra texlive-latex-base texlive-latex-extra texlive-latex-recommended texlive-pictures texlive-science texlive-bibtex-extra texlive-common latex-beamer

如果硬盘充裕的话,直接完整安装也可以:

sudo apt-get install texlive-full latex-beamer

安装完后,就可以安装CJK的相关软件包了,如果只需要获得中文支持,那么执行:

sudo apt-get install latex-cjk-chinese ttf-arphic-* hbf-*

否则,建议安装latex-cjk-all以获取完整支持。



Copy The Files Needed
_________________
make a dir called font, copy the font here.
mkdir ~/font
cd ~/font
cp /media/sda/windows/Fonts/simhei.ttf .

copy all the files needed.
sudo apt-get install fontforge
cp /usr/local/texlive/2007/texmf-dist/source/latex/CJK/utils/subfonts/* ~/font/
cp /usr/local/texlive/2007/texmf/fonts/sfd/*.sfd ~/font/


步骤二 。生成字体(可选,或者进行步骤三)

方法一 Generate Font
______________
Then, make the font. It is a good way to test how fast your computer is :) it takes me 3 minutes to generate the fonts[Core Duo 2].
Some one complain that the procedure take them 1 hours to do so, this is because you use the new version of fontforge. so be sure to use fontforge 2005.

time fontforge -script subfonts.pe simhei.ttf hei Unicode.sfd

create a file name makemap like this:

for i in *.tfm
do
cat >> hei.map <<>

Make map file:
chmod +x makemap
./makemap

create a file name c70hei.fd for CJK package:

% This is c70hei.fd for CJK package.
% created by Edward G.J. Lee
% modify by Yue Wang
\ProvidesFile{c70hei.fd}
\DeclareFontFamily{C70}{hei}{\hyphenchar \font\m@ne}
\DeclareFontShape{C70}{hei}{m}{n}{<-> CJK * hei}{}
\DeclareFontShape{C70}{hei}{bx}{n}{<-> CJKb * hei}{\CJKbold}
\endinput


Copy Fonts into TEXMF
_________________
create the local directory to save the font
cd ~/.texlive2007
cd texmf-var
mkdir -p fonts/map/dvips/CJK
mkdir -p fonts/tfm/CJK/hei
mkdir -p fonts/type1/CJK/hei
mkdir -p tex/latex/CJK/UTF8
cp ~/font/hei.map fonts/map/dvips/CJK/
cp ~/font/*.tfm fonts/tfm/CJK/hei
cp ~/font/*.pfb fonts/type1/CJK/hei
cp ~/font/c70hei.fd tex/latex/CJK/UTF8


Update The System and Test
_____________________
Just run:
texhash
updmap --enable Map hei.map


create a test file to test your work.

\documentclass{article}
\usepackage{CJKutf8}
\begin{document}
\begin{CJK}{UTF8}{hei}
你好!
\end{CJK}
\end{document}


latex test.tex
xdvi test.dvi
dvipdfm test.dvi
xpdf test.pdf
pdflatex test.pdf
......


http://linuxdesktop.cn/2008/02/26/config-texlive-cjk-under-ubuntu.html
简易安装


方法二、生成中文字体包

安装好TexLive+CJK以后,还需要安装一个软件──fontforge用于生成字体:

sudo apt-get install fontforge

好了,前面所做的,都是标准的Debian式安装,假如哪天你不需要了,直接remove安装即可。

生成字体前,请自己准备你需要生成的字体文件:simsun.ttc,simhei.ttf等,这里以simsun.ttc(宋体)为例。

准备好后下载下面这个包,解压到一个地方,如自己的主目录~/font:

font.tar.bz2

然后把simsun.ttc也复制到~/font里去,执行下面的命令生成字体地图:

cd ~/font
time fontforge -script subfonts.pe simsun.ttc song Unicode.sfd

加time是为了计算时间,因为比较耗时,在我的Core 2 Duo T5500下,生成song花了40分钟,生成hei花了24分钟,仅供参考。

字体生成好了,再建立一个描述文件吧。

在~/font下,建立一个makemap文件,内容如下:

for i in *.tfm
do
cat >> song.map <<>

然后在终端下执行:chmod +x makemap让文件加上执行权限,最后执行:

./makemap

再建立一个一个c70song.fd文件:

% This is c70song.fd for CJK package.
% created by Edward G.J. Lee
% modify by Yue Wang
\ProvidesFile{c70song.fd}
\DeclareFontFamily{C70}{song}{\hyphenchar \font\m@ne}
\DeclareFontShape{C70}{song}{m}{n}{<-> CJK * song}{}
\DeclareFontShape{C70}{song}{bx}{n}{<-> CJKb * song}{\CJKbold}
\endinput

好的,相关文件都已生成,开始复制字体使其生效。

执行下面的命令,在你的主目录下生成隐藏的个人Tex配置,如果你哪天不需要了,也可以删除:

mkdir -p ~/.texmf-var/fonts/map/dvips/CJK
mkdir -p ~/.texmf-var/fonts/tfm/CJK/song
mkdir -p ~/.texmf-var/fonts/type1/CJK/song
mkdir -p ~/.texmf-var/tex/latex/CJK/UTF8

建立完这层层叠叠的目录以后,就把刚刚生成的字体复制进去吧。

cp ~/font/song.map ~/.texmf-var/fonts/map/dvips/CJK
cp ~/font/*.tfm ~/.texmf-var/fonts/tfm/CJK/song
cp ~/font/*.pfb ~/.texmf-var/fonts/type1/CJK/song
cp ~/font/c70song.fd ~/.texmf-var/tex/latex/CJK/UTF8

复制完后就执行命令刷新缓存,让它生效:

sudo texhash
updmap --enable Map song.map

假如一切顺序的话, 就测试一下我们安装的song体是否能用吧。

在任意位置编辑这个文件,然后保存为test.tex,支持UTF-8格式:

\documentclass{article}
\usepackage{CJKutf8}
\begin{document}
\begin{CJK}{UTF8}{song}
你好!这里是Ubuntu下的TexLive+CJK环境!
\end{CJK}
\end{document}

执行分别生成pdf文档和用evince来查看文档:

pdflatex test.tex
evince test.pdf

看看你的过程顺不顺利,生成的PDF档也是下面这样吗?


用同样的方法搞定hei和kai等常用中文标准字体,开始享受你的Tex吧!

但是我在OpenSuse 11下此二方法均不可行。

看到解决方法一:

cp ~/font/song.map ~/.texmf-var/fonts/map/dvips/CJK
cp ~/font/*.tfm ~/.texmf-var/fonts/tfm/CJK/song
cp ~/font/*.pfb ~/.texmf-var/fonts/type1/CJK/song
cp ~/font/c70song.fd ~/.texmf-var/tex/latex/CJK/UTF8

改成:
su
cp ~/font/song.map /usr/share/texmf/fonts/map/dvips/CJK
cp ~/font/*.tfm /usr/share/texmf/fonts/tfm/CJK/song
cp ~/font/*.pfb /usr/share/texmf/fonts/type1/CJK/song
cp ~/font/c70song.fd /usr/share/texmf/tex/latex/CJK/UTF8


updmap –enable Map song.map

改成
sudo updmap –enable Map song.map


如果仍然不能出现中文,可以这么做,不保证好,只保证可以用!!


cp ~/font/song.map ~/.texmf-var/fonts/map/dvips/CJK
cp ~/font/*.tfm ~/.texmf-var/fonts/tfm/CJK/song
cp ~/font/*.pfb ~/.texmf-var/fonts/type1/CJK/song
cp ~/font/c70song.fd ~/.texmf-var/tex/latex/CJK/UTF8

and

cp ~/font/song.map /usr/share/texmf/fonts/map/dvips/CJK
cp ~/font/*.tfm /usr/share/texmf/fonts/tfm/CJK/song
cp ~/font/*.pfb /usr/share/texmf/fonts/type1/CJK/song
cp ~/font/c70song.fd /usr/share/texmf/tex/latex/CJK/UTF8

同时存在,应该就可以了。

步骤三:安装中文字体
这个东西我在网上翻腾了好久,终于在 http://bj.soulinfo.com/~hugang/tex/找到了 YueWang-zhfonts-final_1.01.tar.bz2 ,下载放到/home/yourname/目录下

$mv ~/.texlive2007 ~/.texlive2007.bak
$ tar jxvf ~/YueWang-zhfonts-final_1.01.tar.bz2
$ texhash

Emacs中文化指南

0 评论  

地址:http://zhdotemacs.sourceforge.net/emacs/x188.html


3.2 中文设置

3.2.1 通用配置

这一部分是所有系统都要设置的

(set-language-environment 'Chinese-GB)
(set-keyboard-coding-system 'euc-cn)
(set-clipboard-coding-system 'euc-cn)
(set-terminal-coding-system 'euc-cn)
(set-buffer-file-coding-system 'euc-cn)
(set-selection-coding-system 'euc-cn)
(modify-coding-system-alist 'process "*" 'euc-cn)
(setq default-process-coding-system
'(euc-cn . euc-cn))
(setq-default pathname-coding-system 'euc-cn)

3.2.2 Windows配置

这一部分设置Windows下的字体, 解压intlfonts-1.2, 设置变量 fonts-dir为所安装的字体目录

(setq fonts-dir "<path to intlfonts>")
(setq bdf-directory-list
(list
(expand-file-name "Asian" fonts-dir)
(expand-file-name "Chinese" fonts-dir)
(expand-file-name "Chinese.BIG" fonts-dir)
(expand-file-name "Chinese.X" fonts-dir)
(expand-file-name "Ethiopic" fonts-dir)
(expand-file-name "European" fonts-dir)
(expand-file-name "European.BIG" fonts-dir)
(expand-file-name "Japanese" fonts-dir)
(expand-file-name "Japanese.BIG" fonts-dir)
(expand-file-name "Japanese.X" fonts-dir)
(expand-file-name "Korean.X" fonts-dir)
(expand-file-name "Misc" fonts-dir)
(expand-file-name "TrueType" fonts-dir)
(expand-file-name "Type1" fonts-dir)))
(setq w32-bdf-filename-alist
(w32-find-bdf-fonts bdf-directory-list))
(create-fontset-from-fontset-spec
"-*-fixed-medium-r-normal-*-16-*-*-*-c-*-fontset-bdf,
chinese-gb2312:-*-*-medium-r-normal-*-16-*-*-*-*-*-gb2312.1980-*,
japanese-jisx0208:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0208.1983-*,
katakana-jisx0201:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0201*-*,
latin-jisx0201:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0201*-*,
japanese-jisx0208-1978:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0208.1978-*,
thai-tis620:-misc-fixed-medium-r-normal--16-160-72-72-m-80-tis620.2529-1,
lao:-misc-fixed-medium-r-normal--16-160-72-72-m-80-MuleLao-1,
tibetan-1-column:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-80-MuleTibetan-1,
ethiopic:-Admas-Ethiomx16f-Medium-R-Normal--16-150-100-100-M-160-Ethiopic-Unicode,
tibetan:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-160-MuleTibetan-0")
(setq font-encoding-alist
(append '(("MuleTibetan-0" (tibetan . 0))
("GB2312" (chinese-gb2312 . 0))
("JISX0208" (japanese-jisx0208 . 0))
("JISX0212" (japanese-jisx0212 . 0))
("VISCII" (vietnamese-viscii-lower . 0))
("KSC5601" (korean-ksc5601 . 0))
("MuleArabic-0" (arabic-digit . 0))
("MuleArabic-1" (arabic-1-column . 0))
("MuleArabic-2" (arabic-2-column . 0))) font-encoding-alist))
(set-default-font "fontset-bdf")

注意: 上面的中文字体的大小只能为16,24,40,48, 因为intlfonts 中的BDF字体只有这几种大小的中文字体能匹配上面的chinese-gb2312的配置, 此外在Emacs 21.3中还可以这样设置

(set-language-environment 'Chinese-GB)
(set-default-font "-outline-新宋体-normal-r-normal-normal-12-*-96-96-c-*-gb2312")

假如你不知道系统的字体就M-x set-default-font, 然后使用TAB 键来看一下补全的字体信息

3.2.3 X Window设置

X的中文设置我就不说了, 自己搞定吧, 我拷贝了Windows的simsun.ttc 和mingliu.ttc来使用, 看简繁体中文不成问题了, 设置好X的字体后, 通过配置X Resources, 来设置emacs的字体, 通常就是配置$HOME/.Xdefaults, 1024x768的分辨率下可以设置字体为8x16, 800x600可以设置7x14的字体就可以达到字体等宽的效果

emacs.font:  8x16
emacs.paneFont: 8x16
Emacs.pane.menubar.font: 8x16
Emacs.foreground: white
Emacs.background: black
emacs.geometry: 100x32

在Windows下使用Emacs

0 评论  

top在Windows下使用Emacs

top安装Emacs

  1. http://nqmacs.sourceforge.net 下载emacs的Windows编译版本,包括两个文件 emacs-21.3.50.1-20050130c-w32.zipemacs-21.3.50.1-20050130-lisp.zip
  2. emacs-21.3.50.1-20050130c-w32.zip 解压缩到想要放置的目录,这里为 D:\Program Reserved\emacs-21.3.50.1-20050130c-w32
  3. emacs-21.3.50.1-20050130-lisp.zip 也解压缩在这个目录,然后设置环境变量
    HOME=D:\Program Reserved\emacs-21.3.50.1-20050130c-w32
    这样在以后 .emacs.d 目录和 .emacs 文件就都在 $HOME 目录下面了,但是这个方法并不好,因为设置 $HOME 会影响 CygwinMSYS 等很多东西,所以 最好的方法是在注册表中设置 HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs\HOME=%emacs_dir%
  4. 需要自己添加的el文件放在 D:\Program Reserved\emacs-21.3.50.1-20050130c-w32\site-lisp 里面即可

top安装auctex

  1. http://www.gnu.org/software/auctex/ 下载auctex,然后解压到任意目录,不过不要解压到 $HOME 目录下面,这里解压缩到 D:\auctex
  2. 然后可以根据 INSTALL.windows 这个文件进行安装,用cygwin安装的步骤如下:
    $cd d: (或者$cd /cygdrive/d)
    $cd auctex
    $./configure --prefix=d:/"Program Reserved"/emacs-21.3.50.1-20050130c-w32
    --with-emacs=d:/"Program Reserved"/emacs-21.3.50.1-20050130c-w32/bin/emacs.exe
    $make
    $make install
    (注意上面对于有空格的目录要加双引号,同时用/而不是\,用d:而不是/cygdrive/d)
    这样,可以在 $HOME\site-lisp 目录下面看到生成了 auctex 目录,同时在 $HOME 目录下面也生成了一个 var 目录
  3. $HOME\.emacs 文件中添加
    (require 'tex-mik)
    (setq TeX-electric-escape t)
    这样就可以正常使用auctex了

top安装mule-gbk

安装mule-gbk后可以显示更多的汉字,比如朱�基的"�",如果不用mule-gbk是无法正确显示的
  1. http://mule-gbk.sourceforge.net/ 下载mule-gbk,然后解压到任意目录,不过不要解压到 $HOME 目录下面,这里解压缩到 D:\mule-gbk-0.1.2004080701 ,然后仿照auctex的安装方法即可,用cygwin安装的步骤如下:
    $cd d: (或者$cd /cygdrive/d)
    $cd mule-gbk-0.1.2004080701
    $./configure
    $make
    $make lispdir=d:/"Program\ Reserved"/emacs-21.3.50.1-20050130c-w32/site-lisp install
    (注意上面和auctex不同,有空格的目录名空格前要加入一个\)
    最后一条命令中, lispdir 指定的是el文件安装的目录
  2. 现在在 .emacs 中加入
    (setq w32-charset-info-alist
    (cons '("gbk" w32-charset-gb2312 . 936) w32-charset-info-alist))
    (set-w32-system-coding-system 'chinese-gbk)
    (set-selection-coding-system 'chinese-gbk)
    (set-keyboard-coding-system 'chinese-gbk)
    (set-language-environment 'chinese-gbk)
    (setq locale-coding-system 'chinese-gbk)
    (setq current-language-environment "Chinese-GBK")
    呵呵,中文问题解决了

top安装aspell

  1. http://aspell.net/win32/ 下载Windows下的aspell安装程序和词典,这里下载的是 Aspell-0-50-3-3-Setup.exeAspell-en-0.50-2-3.exe
  2. 安装即可,这里安装到 D:\Program Reserved\Aspell
  3. 设置环境变量,将 D:\Program Reserved\Aspell\bin 加入到 $Path
  4. http://kdstevens.com/~stevens/ispell-page.html 下载最新的 ispell.el ,这里下载的是 ispell.el-3.6 ,将其改名为 ispell.el 放到 $HOME\site-lisp 目录下
  5. .emacs 中加入
    (setq-default ispell-program-name "aspell")
    (setq-default ispell-local-dictionary "american")
    (global-set-key (kbd "") 'ispell-complete-word)
    这样就可以使用拼写检查功能了,但是绑定到F8上的complete-word命令还是无法使用,这个需要解决

top安装Mew

  1. http://www.mew.org/Win32/ 下载Mew的Windows版本这里下载的是Mew 4.2,文件为 MEW42W0.ZIP
  2. MEW42W0.ZIP 解压,这里解压到 E:\Download\Temp\MEW42W0\mew-4.2
  3. 安装前需要设置好两个环境变量:一个是 $HOME 变量,当然这在安装emacs的时候已经设置好了,另一个是 $TZ 变量,这个是时区,设置为 JST-8
  4. 注意emacs在Windows下需要执行 $HOME\bin\addpm.exe 来进行一下安装,否则Mew会认为没有安装emacs,然后在cygwin下进行编译:
    $cd e:
    $cd Download/Temp/MEW42W0/mew-4.2/
    $./configure
    $make
  5. 在命令行下执行
    >mew
    然后就根据提示来安装吧
  6. 注意我安装完成之后发现mew所用的图片都没有安装,将解压出来的mew-4.2目下的 etc 目录复制到 D:\Program Reserved\emacs-21.3.50.1-20050130c-w32\site-lisp\mew\ 就可以了
  7. 注意mew中的邮件默认是utf-8编码的,所以需要在mule-gbk的环境下使用utf-8支持,具体看一下 mule-gbk-0.1.2004080701.tar.gz 中的 README.unicode ,具体方法为在在 .emacs 文件中添加
    ;; Unicode support, for Emacs CVS (21.3.50) only
    (when (fboundp 'utf-translate-cjk-mode)
    ;; Load modified utf-translate-cjk-mode
    (require 'gbk-utf-mode)
    ;; Turn on utf-translate-cjk-mode
    (utf-translate-cjk-mode 1)
    ;; Setup X selection for unicode encoding
    (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))
    这样,就可以存取中文Unicode编码的文件了,具体使用方法是:
    C-x RET f utf-8 RET将当前缓冲区的编码改为utf-8然后保存
    C-x RET c utf-8 RET C-x C-s filename RET在保存时转换文件格式
    C-x RET r utf-8 RET用这个命令重新以utf-8编码加载文件
  8. mew的设置和使用请看这里

    top用gnuserv给Emacs插上翅膀

      通常情况下,用Emacs编辑文件需要先启动Emacs,然后C-x C-f,再输入文件的路径,这是很麻烦的, 尤其对于用惯了图形界面的人更是不便,这个问题可以用gnuserv解决,这里是Windows下编译好 的gnuserv。
      gnuserv的安装非常简单,将上面压缩包中的 gnuserv.el 放到 $HOME/site-lisp 目录下,再把release文件夹下的几个 可执行文件放到 $HOME/bin 目录下,然后在.emacs中加入:
    (require 'gnuserv)
    (gnuserv-start)

这样就可以用 gnuclientw.exe 打开文件了,再建立一个 gnuclientw.exe 的快捷方式放到"Documents and Settings\username\SendTo"目录下, 就可以用右键的"发送到"菜单把文件传输到Emacs中编辑了。
   gnuclientw.exe 默认是用一个新的frame打开文件,在.emacs中添加下面的命令可以设置在原来的frame中打开文件:

;; 在当前frame打开
(setq gnuserv-frame (selected-frame))
;; 打开后让emacs跳到前面来
(setenv "GNUSERV_SHOW_EMACS" "1")

  如果你喜欢在新的frame中打开文件,绑定下面几个控制frame的函数,操作frame会简单一些:

;; 关闭一个frame,绑定到 C-F4
(global-set-key [(control f4)] 'delete-frame)
;; 在两个frame中切换
(global-set-key [(control tab)] 'other-frame)
(global-set-key [(control shift tab)] '(lambda ()
(interactive)
(other-frame -1)))

软件开发者面试百问

2009年3月11日星期三

0 评论  


觉得这个帖子不错,但是竟然找不到类似与收藏的功能,为了回头还能看,只好贴到自己博客了。

地址:http://vipnews.csdn.net/newscontent.aspx?pointid=2009_02_12_140215399

软件开发者面试百问

 

  想雇到搞软件开发的聪明人可不容易。万一一不小心,就会搞到一堆低能大狒狒。我去年就碰到这种事了。你肯定不想这样吧。听我的,没错。在树上开站立会议门都没有。

    问点有难度的问题能帮你把聪明人跟狒狒们分开。我决定把我自己整理出来的软件开发者面试百问发出来,希望能帮到你们的忙。

    这个列表涵盖了软件工程知识体系中定义的大多数知识域。当然,如果你只想找出类拔萃的程序员,便只需涉及结构、算法、数据结构、测试这几个话题。如果想雇架构师,也可以只考虑需求、功能设计、技术设计这些地方。

    不过不管你怎么做,都要牢记一点:这里大多数问题的答案都没有对错之分!

    你可以把我的这些问题作为引子,展开讨论。例如下面有个问题是使用静态方法或是单例的缘由。如果那个面试的就此展开长篇大论,那他很有可能是个聪明能干的 家伙!如果他一脸茫然的看着你,发出这种声音,很明显这就是只狒狒了。同样,想知道一个数是不是2的乘方也有很多方法,不过要是面试的人想用mod运算 符,嗯……你知道我的意思吧。(你不知道也没关系,来根香蕉?)

需求

    你能给出一些非功能性(或者质量)需求的例子么?

    如果客户需要高性能、使用极其方便而又高度安全,你会给他什么建议?

    你能给出一些用来描述需求的不同技术么?它们各自适用于什么场景?

    需求跟踪是什么意思?什么是向前追溯,什么是向后追溯?

    你喜欢用什么工具跟踪需求?

    你怎么看待需求变化?它是好是坏?给出你的理由。

    你怎样研究需求,发现需求?有哪些资源可以用到?

    你怎么给需求制定优先级?有哪些技术?

    在需求过程中,用户、客户、开发人员各自的职责是什么?

    你怎么对待不完整或是令人费解的需求?

功能设计

    在功能设计中有哪些隐喻?给出几个成功的例子。

    如果有些功能的执行时间很长,怎么能让用户感觉不到太长的等待?

    如果用户必须要在一个很小的区域内,从一个常常的列表中选择多个条目,你会用什么控件?

    有哪些方法可以保证数据项的完整?

    建立系统原型有哪些技术?

    应用程序怎样建立对用户行为的预期?给出一些例子。

    如何入手设计一组数量庞大而又复杂的特性,你能举出一些设计思路吗?

    有一个列表,其中有10个元素,每个元素都有20个字段可以编辑,你怎样设计这种情况?如果是1000个元素,每个元素有3个字段呢?

    用不同的颜色对一段文本中的文字标记高亮,这种做法有什么问题?

    Web环境和Windows环境各有些什么限制?

技术设计

    什么是低耦合和高聚合?封装原则又是什么意思?

    在Web应用中,你怎样避免几个人编辑同一段数据所造成的冲突?

    你知道设计模式吗?你用过哪些设计模式?在什么场合下用的?

    是否了解什么是无状态的业务层?长事务如何与之相适应?

    在搭建一个架构,或是技术设计时,你用过几种图?

    在N层架构中都有哪些层?它们各自的职责是什么?

    有哪些方法可以确保架构中数据的正确和健壮?

    面向对象设计和面向组件设计有哪些不同之处?

    怎样在数据库中对用户授权、用户配置、权限管理这几项功能建模?

    怎样按照等级制度给动物王国(包括各种物种和各自的行为)建模?

程序设计

    你怎样保证你的代码可以处理各种错误事件?

    解释一下什么是测试驱动开发,举出极限编程中的一些原则。

    看别人代码的时候,你最关心什么地方?

    什么时候使用抽象类,什么时候使用接口?

    除了IDE以外,你还喜欢哪些必不可少的工具?

    你怎么保证代码执行速度快,而又不出问题?

    什么时候用多态,什么时候用委派?

    什么时候使用带有静态成员的类,什么时候使用单例?

    你在代码里面怎么提前处理需求的变化?给一些例子。

    描述一下实现一段代码的过程,从需求到最终交付。

算法

    怎样知道一个数字是不是2的乘方?怎样判断一个数是不是奇数?

    怎样找出链表中间的元素?

    怎样改变10,000个静态HTML页面中所有电话号码的格式?

    举出一个你所用过的递归的例子。

    在散列表和排序后的列表中找一个元素,哪个查找速度最快?

    不管是书、杂志还是网络,你从中所学到的最后一点算法知识是什么?

    怎样把字符串反转?你能不用临时的字符串么?

    你愿意用什么类型的语言来编写复杂的算法?

    有一个数组,里面是从1到1,000,000的整数,其中有一个数字出现了两次,你怎么找出那个重复的数字?

    你知道“旅行商问题(Traveling Salesman Problem)”么?

数据结构

    怎样在内存中实现伦敦地铁的结构?

    怎样以最有效的方式在数据库中存储颜色值?

    队列和堆栈区别是什么?

    用堆或者栈存储数据的区别是什么?

    怎样在数据库中存储N维向量?

    你倾向于用哪种类型的语言编写复杂的数据结构?

    21的二进制值是什么?十六制值呢?

    不管是书、杂志还是网络,你从中所学到的最后一点数据结构的知识是什么?

    怎样在XML文档中存储足球比赛结果(包括队伍和比分)?

    有哪些文本格式可以保存Unicode字符?

测试

    什么是回归测试?怎样知道新引入的变化没有给现有的功能造成破坏?

    如果业务层和数据层之间有依赖关系,你该怎么写单元测试?

    你用哪些工具测试代码质量?

    在产品部署之后,你最常碰到的是什么类型的问题?

    什么是代码覆盖率?有多少种代码覆盖率?

    功能测试和探索性测试的区别是什么?你怎么对网站进行测试?

    测试套件、测试用例、测试计划,这三者之间的区别是什么?你怎么组织测试?

    要对电子商务网站做冒烟测试,你会做哪些类型的测试?

    客户在验收测试中会发现不满意的东西,怎样减少这种情况的发生?

    你去年在测试和质量保证方面学到了哪些东西?

维护

    你用哪些工具在维护阶段对产品进行监控?

    要想对一个正在产品环境中被使用的产品进行升级,该注意哪些重要事项?

    如果在一个庞大的文件中有错误,而代码又无法逐步跟踪,你怎么找出错误?

    你怎样保证代码中的变化不会影响产品的其他部分?

    你怎样为产品编写技术文档?

    你用过哪些方式保证软件产品容易维护?

    怎样在产品运行的环境中进行系统调试?

    什么是负载均衡?负载均衡的方式有哪些种?

    为什么在应用程序的生命周期中,软件维护费用所占的份额最高?

    再造工程(re-engineering)和逆向工程(reverse engineering)的区别是什么?

配置管理

    你知道配置管理中基线的含义么?怎样把项目中某个重要的时刻冻结?

    你一般会把哪些东西纳入版本控制?

    怎样可以保证团队中每个人都知道谁改变了哪些东西?

    Tag和Branch的区别是什么?在什么情况下该使用tag,什么时候用branch?

    怎样管理技术文档——如产品架构文档——的变化?

    你用什么工具管理项目中所有数字信息的状态?你最喜欢哪种工具?

    如果客户想要对一款已经发布的产品做出变动,你怎么处理?

    版本管理和发布管理有什么差异?

    对文本文件的变化和二进制文件的变化进行管理,这二者有什么不同?

    同时处理多个变更请求,或是同时进行增量开发和维护,这种事情你怎么看待?

项目管理

    范围、时间、成本,这三项中哪些是可以由客户控制的?

    谁该对项目中所要付出的一切做出估算?谁有权设置最后期限?

    减少交付的次数,或是减少每个每个交付中的工作量,你喜欢哪种做法?

    你喜欢用哪种图来跟踪项目进度?

    迭代和增量的区别在哪里?

    试着解释一下风险管理中用到的实践。风险该如何管理?

    你喜欢任务分解还是滚动式计划?

    你需要哪些东西帮助你判断项目是否符合时间要求,在预算范围内运作?

    DSDM、Prince2、Scrum,这三者之间有哪些区别?

    如果客户想要的东西太多,你在范围和时间上怎样跟他达成一致呢?

unix 体验中心

0 评论  


学校到家,家到学校,每次都需要换机器,换系统,每次都是一个郁闷的事情。整一台新机器到能用最少需要3天时间,可是3天过去了,东西搞好了,还没有怎么用呢,说不定时间就到了,又该走了。

 

我需要一台unix机器

1 可以编程c,最好有数据库

2 不能每次换地方都要重新配置。

3 即使是同一个地方,换台机器,也不需要重新配置,直接使用。

 

我想是不是有提供ssh服务的主机,上边可以编程序,可以注册用户,里边存放需要的文件呢??

 

 

呵呵,还真是找到了,unix体验中心。

下边简单介绍一个适合我的使用方法:

第一步:

注册帐号,确认邮件。

第二步

下载putty,设置。

putty设置

第三步

登录:

登录

使用:

putty调用xemacs

putty调用xemacs

 

使用gcc和查看结果

查看结果

 

这有一篇文章叫做:从Windows登陆本站服务器的几种方法

http://www.unix-center.net/?p=10

 

这一篇:unix体验中心的FAQ

http://www.unix-center.net/?p=4

linux下为永中office添加字体

0 评论  


cp /windows/C/windows/Fonts/* /usr/share/fonts/truetype/

cd /usr/share/fonts/truetype/

chmod 644 *

cd

mkfontscale

mkfontdir

fc-cache

uml类之间的关系及其异同

0 评论  


参考:http://www.cnblogs.com/ForEverKissing/archive/2007/12/13/993818.html
参考:http://www.blogjava.net/hongzionline/archive/2007/09/27/148685.html

1.  关联:连接模型元素及链接实例,用一条实线来表示;
2.  依赖:表示一个元素以某种方式依赖于另一个元素,用一条虚线加箭头来表示;
3.  聚集:表示整体与部分的关系,用一条实线加空心菱形来表示;
4.  组成:表示整体与部分的有一关系,用一条实线加实心菱形来表示;
             (关联,依赖,聚集,组成的异同见后描述)
5.  泛化(继承):表示一般与特殊的关系,用一条实线加空心箭头来表示;
6.  实现:表示类与接口的关系,用一条虚线加空心箭头来表示;

依赖是比关联弱的关系,关联代表一种结构化的关系,体现在生成的代码中,以java为例:  
  若类A单向关联指向类B,则在类A中存在一个属性B   b。  
  若类A依赖类B,则不会有这个属性,类B的实例可能存在于某个方法调用的参数中,或某个方法的局部变量中。


例如代码:

     依赖----存在于某个方法调用的参数中,或某个方法的局部变量中。

Person类与Screwdriver类的依赖关系

[代码表现]

public class Person{   
    /** 拧螺丝 */  
    public void screw(Screwdriver screwdriver){   
        screwdriver.screw();   
    }   
}   

    关联:---存在一个属性

公司(Company)和员工(Employee)的关联关系

[代码表现]
public class Company{   
    private Employee employee;   
    public Employee getEmployee(){   
        return employee;   
    }   
    public void setEmployee(Employee employee){   
        this.employee=employee;   
    }   
    //公司运作   
    public void run(){   
        employee.startWorking();   
    }   
}  

    
    聚合: 空心菱形加实线箭头表示
 表示C9聚合C10,但是C10可以离开C9而独立存在(独立存在的意思是在某个应用的问题域中这个类的存在有意义。这句话怎么解,请看下面组合里的解释)。
 同构性,主体和部分不具有生命期的一致性

课程组可由多个学生组成,课程组撤消了,学生还活得好好的,这是聚合。


    组合(也有人称为包容):一般是实心菱形加实线箭头表示
 异构性,部分和主体具有生命期上的一致性

表示的是C8被C7包容,而且C8不能离开C7而独立存在。但这是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它 离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。在《敏捷开发》中还说到,A组合B,则A需 要知道B的生存周期,即可能A负责生成或者释放B,或者A通过某种途径知道B的生成和释放。

组合的例子:你显示屏上的浏览器窗口,关闭浏览器,上面的按纽死掉不见了,这是组合(再打开一个浏览窗口,按纽已经不是原来的了)。

c多范型

0 评论  


#include <stdio.h>
#include <conio.h>
#include <string.h>
int compare_int(int *array,int n)
{
    int i,j,temp;
    for(i=0;i <n-1;i++)
    for(j=i+1;j <n;j++)
    {
        if(array[i] > array[j])
      {temp=array[i];array[i]=array[j];array[j]=temp;}
    } 
}
int compare_char(char *array,int n)
{
  int i,j;
  char temp;
    for(i=0;i <n-1;i++)
    for(j=i+1;j <n;j++)
    {
        if(array[i] > array[j])
      {temp=array[i];array[i]=array[j];array[j]=temp;}
    } 
}
int compare_double(double *array,int n)
{
  int i,j;
  double temp;
    for(i=0;i <n-1;i++)
    for(j=i+1;j <n;j++)
    {
        if(array[i] > array[j])
      {temp=array[i];array[i]=array[j];array[j]=temp;}
    }
}
int (*compare_oper[9])(void *array,int n)={NULL,compare_char,NULL,NULL,compare_int,NULL,NULL,NULL,compare_double};
void sort(void *str,int const n,int const len,int (*compare_oper[])(void *array,int n))
{
  compare_oper[len](str,n);   
}
void main()
{
    int i;
  int a[]={1,9,2,5,3}; #include <stdio.h>
#include <conio.h>
#include <string.h>
int compare_int(int *array,int n)
{
    int i,j,temp;
    for(i=0;i <n-1;i++)
    for(j=i+1;j <n;j++)
    {
        if(array[i] > array[j])
      {temp=array[i];array[i]=array[j];array[j]=temp;}
    } 
}
int compare_char(char *array,int n)
{
  int i,j;
  char temp;
    for(i=0;i <n-1;i++)
    for(j=i+1;j <n;j++)
    {
        if(array[i] > array[j])
      {temp=array[i];array[i]=array[j];array[j]=temp;}
    } 
}
int compare_double(double *array,int n)
{
  int i,j;
  double temp;
    for(i=0;i <n-1;i++)
    for(j=i+1;j <n;j++)
    {
        if(array[i] > array[j])
      {temp=array[i];array[i]=array[j];array[j]=temp;}
    }
}
int (*compare_oper[9])(void *array,int n)={NULL,compare_char,NULL,NULL,compare_int,NULL,NULL,NULL,compare_double};
void sort(void *str,int const n,int const len,int (*compare_oper[])(void *array,int n))
{
  compare_oper[len](str,n);   
}
void main()
{
    int i;
  int a[]={1,9,2,5,3};
  char *b="china";
  double c[]={2.5,1.1,4.99,1.5,1};
  sort(a,sizeof(a)/sizeof(int),sizeof(int),compare_oper);
  sort(b,strlen(b),sizeof(char),compare_oper);
  sort(c,sizeof(c)/sizeof(double),sizeof(double),compare_oper);
  for(i=0;i <5;i++)
    {printf("%d\n",a[i]);printf("%c\n",b[i]);printf("%ld\n",c[i]);}
  getch();
}
  char b[]="china";
  double c[]={2.5,1.1,4.99,1.5,1};
  sort(a,sizeof(a)/sizeof(int),sizeof(int),compare_oper);
  sort(b,strlen(b),sizeof(char),compare_oper);
  sort(c,sizeof(c)/sizeof(double),sizeof(double),compare_oper);
  for(i=0;i <5;i++)
    {printf("%d\n",a[i]);printf("%c\n",b[i]);printf("%ld\n",c[i]);}
  getch();
}

static和const的比较和解释

0 评论  


来源:http://www.builder.com.cn/2008/1013/1168968.shtml


遇到这样的定义,不太明白
static const int a;

于是查了下static和const的东西,拿来好好研究研究


static 是c++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因、作用谈起,全面分析static 修饰符的实质。

  static 的两大作用:

  一、控制存储方式:

  static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间。

  1、引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现?

  最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。

  2、 解决方案:因此c++ 中引入了static,用它来修饰变量,它能够指示编译器将此变量在程序的静态存储区分配空间保存,这样即实现了目的,又使得此变量的存取范围不变。

  二、控制可见性与连接类型 :

  static还有一个作用,它会把变量的可见范围限制在编译单元中,使它成为一个内部连接,这时,它的反义词为”extern”.

    也就是说,static的作用于是文件内,extern是文件间,但必须是有extern声明的文件才可以用,而全局就是工程内可用。


  static作用分析总结:static总是使得变量或对象的存储形式变成静态存储,连接方式变成内部连接,对于局部变量(已经是内部连接了),它仅改变其存储方式;对于全局变量(已经是静态存储了),它仅改变其连接类型。

  类中的static成员:

  一、出现原因及作用:

  1、需要在一个类的各个对象间交互,即需要一个数据对象为整个类而非某个对象服务。

  2、同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。

  类的static成员满足了上述的要求,因为它具有如下特征:有独立的存储区,属于整个类。

  二、注意:

  1、对于静态的数据成员,连接器会保证它拥有一个单一的外部定义。静态数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。

  2、类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数。

  

      const 是c++中常用的类型修饰符,但我在工作中发现,许多人使用它仅仅是想当然尔,这样,有时也会用对,但在某些微妙的场合,可就没那么幸运了,究其实质原 由,大多因为没有搞清本源。故在本篇中我将对const进行辨析。溯其本源,究其实质,希望能对大家理解const有所帮助,根据思维的承接关系,分为如 下几个部分进行阐述。

  c++中为什么会引入const

  c++的提出者当初是基于什么样的目的引入(或者说保留)const关键字呢?,这是一个有趣又有益的话题,对理解const很有帮助。

  1. 大家知道,c++有一个类型严格的编译系统,这使得c++程序的错误在编译阶段即可发现许多,从而使得出错率大为减少,因此,也成为了c++与c相比,有着突出优点的一个方面。

  2. c中很常见的预处理指令 #define variablename variablevalue 可以很方便地进行值替代,这种值替代至少在三个方面优点突出:

  一是避免了意义模糊的数字出现,使得程序语义流畅清晰,如下例:

  #define user_num_max 107 这样就避免了直接使用107带来的困惑。

  二是可以很方便地进行参数的调整与修改,如上例,当人数由107变为201时,进改动此处即可,

  三是提高了程序的执行效率,由于使用了预编译器进行值替代,并不需要为这些常量分配存储空间,所以执行的效率较高。

  鉴于以上的优点,这种预定义指令的使用在程序中随处可见。

  3. 说到这里,大家可能会迷惑上述的1点、2点与const有什么关系呢?,好,请接着向下

  看来:

  预处理语句虽然有以上的许多优点,但它有个比较致命的缺点,即,预处理语句仅仅只是简单值替代,缺乏类型的检测机制。这样预处理语句就不能享受c++严格类型检查的好处,从而可能成为引发一系列错误的隐患。

  4.好了,第一阶段结论出来了:

  结论: const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。

  现在它的形式变成了:

  const datatype variablename = variablevalue ;

  为什么const能很好地取代预定义语句?

  const 到底有什么大神通,使它可以振臂一挥取代预定义语句呢?

  1. 首先,以const 修饰的常量值,具有不可变性,这是它能取代预定义语句的基础。

  2. 第二,很明显,它也同样可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。

  3. 第三,c++的编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中这使得它成为一个编译期间的常量,没有了存储与读内存的操作, 使得它的效率也很高,同时,这也是它取代预定义语句的重要基础。这里,我要提一下,为什么说这一点是也是它能取代预定义语句的基础,这是因为,编译器不会 去读存储的内容,如果编译器为const分配了存储空间,它就不能够成为一个编译期间的常量了。

  4. 最后,const定义也像一个普通的变量定义一样,它会由编译器对它进行类型的检测,消除了预定义语句的隐患。

  const 使用情况分类详析

  1.const 用于指针的两种情况分析:

  int const *a;  file://a可变,*a不可变

  int *const a;  file://a不可变,*a可变

  分析:const 是一个左结合的类型修饰符,它与其左侧的类型修饰符和为一个类型修饰符,所以,int const 限定 *a,不限定a。int *const 限定a,不限定*a。

  2.const 限定函数的传递值参数:

  void fun(const int var);

  分析:上述写法限定参数在函数体中不可被改变。由值传递的特点可知,var在函数体中的改变不会影响到函数外部。所以,此限定与函数的使用者无关,仅与函数的编写者有关。

  结论:最好在函数的内部进行限定,对外部调用者屏蔽,以免引起困惑。如可改写如下:

  void fun(int var){

  const int &varalias = var;

  varalias ....

  .....

  }

  3.const 限定函数的值型返回值:

  const int fun1();

  const myclass fun2();

  分析:上述写法限定函数的返回值不可被更新,当函数返回内部的类型时(如fun1),已经是一个数值,当然不可被赋值更新,所以,此时 const无意义,最好去掉,以免困惑。当函数返回自定义的类型时(如fun2),这个类型仍然包含可以被赋值的变量成员,所以,此时有意义。

  4. 传递与返回地址: 此种情况最为常见,由地址变量的特点可知,适当使用const,意义昭然。

  5. const 限定类的成员函数:

  class classname {

  public:

  int fun() const;

  .....

  }

  注意:采用此种const 后置的形式是一种规定,亦为了不引起混淆。在此函数的声明中和定义中均要使用const,因为const已经成为类型信息的一部分。

  获得能力:可以操作常量对象。

  失去能力:不能修改类的数据成员,不能在函数中调用其他不是const的函数。

sizeof--我的命门

0 评论  

http://blog.csdn.net/lnever/archive/2009/01/03/3695590.aspx

转自:http://topic.csdn.net/u/20081121/21/02fd5ae1-ff29-447c-8c6d-67da15e9ff0e.html

 sizeof:
i.在32位操作系统中,基本数据类型
类型                  字节长度
char                    1
short                    2
short    int            2
signed short            2
unsigned short          2
int                      4
long    int            4
signed  int            4
unsigned int(unsigned)  4
long                    4
unsigned long            4
float                    4
double                  8
void*                    4 (所有指针类型长度都一样)(char*,int*,float*,double*)
enum                    4

ii.在32位操作系统中,定义或函数中的大小
char a[]="hello";
char b[100];
char *p=a;
类型                  字节长度
sizeof(a)                6
sizeof(b)                100
sizeof(p)                4

void Func(char a[100])
{
    sizeof(a);        //4
}

#pragma pack(1)
struct A
{
    int i;
    char j;
};
sizeof(A)              //5

#pragma pack(1)
struct A
{
int o;
int j;
union
{
int i[10],j,k;
};

};
sizeof(A)              //48

#pragma pack(1)
struct A
{
    enum  day{monring,  moon,  aftermoon}; 
};
sizeof(A)              //1
sizeof(A::day)        //4

查看linux当前运行哪些服务

0 评论  

http://blog.csdn.net/lnever/archive/2008/10/19/3100423.aspx

chkconfig --list

关闭服务
chkconfig xxx off

 

或者

service –status-all | grep running

service –status-all | grep http

SuSE 安装 永中Office + 界面方块乱码解决方法

0 评论  

文章出处:http://www.jiayisand.com/showart/suse-yongzhong-office-76

永中Office
出了2009个人集成版,而且完全免费使用~最主要,它有Linux平台的版本

今天有空,在SuSE下装之。功能 字体感觉比OpenOffice要好,估计在Win下可以取代MS Office了,嘿嘿。。。

SuSE安装步骤:
1.在http://www.evermoresw.com.cn/webch/download/downEIOPersonal.jsp下载Linux版本
////转注,我在suse下边用wget curl分别下载了有五次以上,都说CRC校验错误,后来又去华军、天网等下载都是错误。无语。最后还是去windows下,迅雷了一个,才没有问题。郁闷!!为什么???
2,解压包
CODE
tar zxvf EIOffice_Personal_Lin.tar.gz
3.安装
这里说一下,开始直接运行setup.sh文件,弹出的安装对话框一片空白。之前安装其他版本的永中Office也是这种情况。不过SuSE用户别灰心,JAVA运行边可以搞定
CODE
java -jar dispose.jar
一路下一步,OK


///在我的机器下没有出现这个问题,不过安装必须是root
4.小小的配置
sanding的机器运行永中Office,弹出的界面依然空白......想是不是GTK库不兼容...Baidu找到症结,编辑/usr/bin/eio
CODE
vi/usr/bin/eio
看到开头几句,有点崩溃。。。
#!/bin/bash
if test -n "$(grep  "Ubuntu"  /proc/version)"; then
   export AWT_TOOLKIT=MToolkit
else
   export AWT_TOOLKIT=XToolkit
fi
竟然只顾及 Ubuntu 。。。�...
将上面 #!/bin/bash 后面的语句替换成 export AWT_TOOLKIT=MToolkit,重新启动永中Office。Gooood,It works well~

永中Office做得很符合中国人习惯:MS office 流,字体 界面很舒服。虽然SuSE下的安装有点小波折,不过赞誉是应该的~上张图吧






界面方块乱码及其解决方案:
在另一台机器安装时,发现一个问题。就是永中打开后是方块的乱码,google了下,是java字体的问题或者权限的问题。
有两种方案,一是更改默认的jre,而是更改字体的权限。
第一种我没有实验。
1  在安装文件夹里有个fonts文件夹,将里边的yzdwsj6.ttf,拷贝到安装目录下的.Jre/lib/fonts/,如果是默认安装的话,应该是放到/usr/local/Evermore/EIOffice/Jre/li/fonts文件夹下。
2 sudo chmod 755 /usr/local/Evermore/EIOffice/Jre/li/fonts/yzdwsj6.ttf
或者sudo chmod a+x /usr/local/Evermore/EIOffice/Jre/li/fonts/yzdwsj6.ttf。

再启动就ok   :)

Ctex基本安装,使用

0 评论  

http://blog.csdn.net/lnever/archive/2008/03/24/2212046.aspx


http://www.ctex.org/CTeXDownload

下载 ctex basic和full都可以,ctex可以自动上网下载所需要的包
和ctexfonts。

http://www.ctex.org/HomePage
下载
这些是模板,可以直接用,也可以用来模仿、体会怎么写。

帮助文档

faq是必须要看的。可以说是中文入门,非常不错。

LaTeX + CJK 到底干了什么?(转)

0 评论  

http://blog.csdn.net/lnever/archive/2008/03/20/2199125.aspx


LaTeX + CJK 到底干了什么?
很多人被 LaTeX 的各种文件,字体搞的头昏脑胀(我就曾经是其中一个). 其实 LaTeX+CJK
处理汉字的过程很简单。是这样的: 首先你编辑了一个文件 example.tex,里面有如下内
容:
documentclass{article}
usepackage{CJK}
begin{CJK}{GBK}{song}
begin{document}

end{CJK}
end{document}
1. 用户在命令行敲入 "latex example.tex". 一个跟 "tex" 一模一样只不过叫做
"latex"的程序启动了。它其实就是 TeX, LaTeX 和 TeX 其实是同一个程序。在有
些系统下 latex 是一个脚本,里面只有几行字。比如我的 Linux 版本就是这样:
#!/bin/sh
test -f "`kpsewhich latex.fmt`" || fmtutil --byfmt latex
exec tex -fmt=latex "$@"
2. TeX 发现自己是用叫做 "latex" 的命令启动的。或者脚本里明显指明了需要
"latex"格式,它就去读入一个宏包叫做 latex.fmt. 这个文件一般在
$TEXMF/web2c. 以后我们就进入了 LaTeX 的世界,看到了?LaTeX 只是 TeX 的一
种特殊情况(一种"格式")。所以如果你能明白 TeX, LaTeX 给你的很多条条框框
你都可以不遵守。
3. LaTeX 发现用户使用了 CJK 宏包,在 begin{CJK}{GBK}{song} 时,CJK 宏包把从
现在开始一直到 end{CJK} 的内容里的中文都变成了一些奇怪的TeX命令。这些命
令根据不同的汉字转换不同的字体。它发现"您",它就会把字体设置为
gbksong51, 然后取里面的第115个字符,我们的汉字"您"变成了
"C19/song/m/n/10/51 s"(s的 ASCII 码是115)。
4. LaTeX 继续处理文档的其它部分,就象处理其它任何英语文件一样……最后生成了
dvi 文件。
5. 用户用 dvips 生成 PostScript 文件。dvips 找到 config.ps 配置,读取里面的
字体映射文件列表,列表里有一个文件叫做 cjk.map, 它就去读取 cjk.map.
cjk.map 指出:gbksong51 这个字体的图像应该从文件 gbksong51.pfb 里得到……
6. dvips 读取 dvi 文件,发现里面要求使用 gbksong51 这个字体,它下载
(download) gbksong51.pfb到生成的 PostScript 文件 example.ps, 然后在合适的
位置放上对"您"索引。现在你打开 example.ps 看看里面有如下内容:
%%BeginFont: SimSun51
%!FontType1-1.0: SimSun 2.10
%%Creator: ttf2pfb, $Id: ttf2pfb.c,v 1.2 2002/07/27 1258 wy Exp $
%%CreationDate: Sun Jul 28 1729 2002
%%VMusage: 030000 030000
...............
%%Page: 1 1
TeXDict begin 1 0 bop 639 523 a Fb(s)1926 8991 y Fa(1)p
eop end
%%Trailer
....
看到没有?"SimSun51", "(s)" 就是字体和对"您"的索引。而那个SimSun,就是所谓的 PostScript 字体名字。这就是你的PS文档。

Windows 下的 coLinux �境�置

0 评论  

来源:http://vision.twbbs.org/~letoh/blog/?p=174 ,感谢

coLinux 的全名是 Cooperative Linux,介紹到此結束 (爆)。這篇只是我的記錄,所以不想打太多字啦,簡單的說就是可以把 Linux 當作一般的應用程式來執行,所以是直接執行 Linux,額外的負擔比較少 (要執行 VM 或 cygwin 也是需要額外資源的)。

雖然我自己大部份時間是使用 Linux 作業,但有時候就是很無奈,因為種種原因只能在 Windows 上操作,不過嘗過 Linux 甜頭的人實在是很難適應 Windows 那樣貧乏的環境;有時則是因為臨時需要 Linux 的實驗環境,但主要工作都在 Windows 上,很難完全轉移。我相信這類情況不是只有我遇到,因此就出現了各種解決方案。

過去最常見的方式是執行 Virtual Machine,如 VMWareVirtual PC 等等,或者是透過 cygwin 之類的模擬環境,還有我這次想介紹的 coLinux。這些工具各有優劣,我只就我個人的使用經驗來談:Virtual Machine 太耗資源,cygwin 環境雖然很接近,但有些跟終端機相關的設定又不太一樣,用起來很不順手。而 coLinux 跑的是 User-mode Linux,環境上最接近真正的 Linux (根本就是),大部份操作跟真正的 Linux 環境下是一樣的,設定檔也可以直接搬過來用。所以自從我知道有這種好東西後,就把其他工具丟掉,專心試用 coLinux。

我的目標大概是這些:

  • 可以使用 putty 連線到 coLinux 中進行作業
  • coLinux 可以連線到外面的網路,方便系統更新
  • Windows 與 coLinux 的檔案交換
  • X 環境?

我會記錄如何達到這些目標。但這篇筆記的不包含 Linux 的使用,因此很多東西除非必要,或者是我自己覺得需要特別註解,不然我就不特別解釋了。因此內容主要著重在建立整個環境與設定,主要是方便我自己作業。有 其他需求的話請自行調整,設定或操作上的問題也歡迎和我一起討論。網路上可以找到不少介紹 coLinux 的文章,也可以多參考。

安裝

第一步當然是安裝啦。要將 Linux 當作一般的應用程式來執行需要特殊版本的 kernel,coLinux 主要就是在做這件事。因此它不包含 Linux 的其他環境,需要另外下載。我個人習慣的的是 Slackware,但因為沒有現成的 disk image 可以用,所以退而求其次用 Debian image。其他還有 Arch / Fedora / Gentoo 等選擇,挑一個自己習慣的就好。下載點可以參考 wikisf.net

Windows 下的軟體安裝相信不會有問題,這邊就不多說了。接下來用 7-ZipWinRAR 之類的軟體解開下載好的 disk image,放在自己喜歡的地方 (建議不要放在路徑有空白或中文字的地方)。

接下來就是修改一下設定檔了。我習慣把設定檔跟 disk image 放在一起,往後直接指定設定檔路徑就好,比較不會搞混。設定檔只是單純的 XML 格式,通常簡單修改一下預設值就可以了跑了。需要修改的地方大概有 image path、memroy size 和 network:

<block_device index="0" path="DosDevicese:coLinuxfs_root" enabled="true" />
<memory size="256" />
<network index="0" type="tap" />

執行的時候輸入 (路徑請自行代換):

colinux-daemon -t nt -c e:coLinuxcolinux.xml

因為我覺得內附的 fltk cosole 很醜,所以直接用 nt 就好了。如果看得到 boot 過程並到達登入畫面,代表設定無誤,可以試著登入看看。一般都會有 root 帳號,但密碼卻不一定,有的不需要密碼,有的是用 'root' 或 'colinux' 當作密碼,這個只能自己試試看了 (也許 wiki 上有寫)。登入無誤的話,基本安裝就算是完成了,可以進行下一節的設定。

基礎設定(一)

這些現成的 disk image 環境通常不符合自己的習慣,所以通常需要稍微設定一下。以我下載的 Debian image 來說,root 沒有密碼,甚至連 shadow 檔都沒有;網路還沒設定,檔案也有點舊了。幸好 Debian 的升級還算方便,所以整個過程不會太難。

首先是密碼的部份。解決方式很簡單,只要建一個 shadow 檔,執行 pwconv 指令,再透過 passwd 設定 root 密碼就可以了。接著就可以建立一般使用者的帳號作為平常工作使用。我個人習慣透過 sudo 來管理系統,除非需要長時間使用 root 權限,不然很少動用 su。因此還需要設定一下 /etc/sudoers:(執行 visudo)

letoh   ALL=(ALL) ALL

覺得每次要打密碼很煩的話就加個 NOPASSWD 吧。詳細的設定語法可以 man sudoers

印象中還缺了一些重要檔案,例如 /etc/hosts/etc/hostname/etc/resolv.conf 等等,請檢查一下並手動建立。

另外,我習慣把 home 獨立放到一個 disk image 中,這樣的話如果有多個 root image 的話可以共用個人資料,會方便許多;備份時也會很方便,好處多多。做法很簡單,先到 這裡下載空的 fs image,編輯設定檔 colinux.xml

<block_device index="1" path="DosDevicese:coLinuxfs_home" enabled="true" />

這需要重新啟動 coLinux 才會生效。順帶一提,這個 disk image 在 coLinux 中對應的 device 是 /dev/cobd1,最後的數字對應到設定檔中的 index 值。重新進入 coLinux 後可以試著 mount 看看有沒有問題:

mkdir -p /mnt/test
mount -t ext3 /dev/cobd1 /mnt/test

沒問題的話可以寫進 /etc/fstab,往後開機就會自動載入了 (記得 /home 的資料先移到新的 disk image 中):

/dev/cobd1 /home ext3 defaults 0 1

如果覺得需要 swap 的話也可以依此類推建立。

到這裡應該覺得輸入很不方便吧,沒有順手的 editor;尤其是需要 copy&paste 的時候。我的目標是利用 putty 連線進去,但因為網路還沒設定好,系統也未必有裝 sshd,所以暫時擱下系統的更新,先把網路搞好再說。

網路設定(一)

這個小節的目標是搞定 Windows 上的網路設定,讓 Windows 可以連線到 coLinux,而 coLinux 也可以連線到外面的網路。首先是對外網路卡的設定,我選擇了 TAP + NAT 的方式來設置 coLinux 的網路環境。至於 bridge 環境的設定可以參考網路上其他文章的介紹

一般我是把 TAP 設定成 192.168.0.1,至於 default gw 與 name server 請自行參考原本的網路環境來設定。

再來是網路分享設定。找到對外的網路卡後,在進階的設定頁中勾選允許分享連線的選項,請參考下圖。

有些版本的 Windows 還可以選擇要分享給哪一個連線 (我搞不清楚是哪個版本),記得要選擇 TAP 那個網路,不然 coLinux 就不能上網了。

網路設定(二)

搞定 Windows 端的網路後,coLinux 對外的網路已經通了,但設定可能還不完備,可以先用 ifconfig 指令看一下,必要時再手動調整一下 (視使用的 distro image 而異)。

以我使用的 Debian 為例,需要設定的地方在 /etc/network/interfaces,設定內容如下:

auto lo eth0

iface eth0 inet static
address 192.168.0.40
gateway 192.168.0.1
netmask 255.255.255.0

iface lo inet loopback

存檔後重新啟動網路即可:

/etc/init.d/networking restart

如果喜歡用 ifocnfig eth0 … uproute add 來設定也可以,default gw 設成 192.168.0.1 就可以出去了。通通設定好以後就可以用 apt-get 將系統更新到最新的狀態了,我習慣更新到 testing,可以安裝比較多套件,穩定性也不會太差。先修改 apt 的設定檔 /etc/apt/sources.list

deb http://http.us.debian.org/debian testing main contrib non-free
deb http://security.debian.org/ testing/updates main contrib non-free

再進行更新:

apt-get update
apt-get dist-upgrade

詳細操作請自行參考 Debian 的教學文件。一開始的 distro image 很陽春,可能有不少東西需要安裝,我唯一建議安裝的套件是 openssh,這樣我們就可以透過 putty 來連線,或是用 sftp 來進行檔案交換:

apt-get install openssh

至此雙向的網路已經暢通,可以用 putty 連線到 192.168.0.40 看看 ssh 連線有沒有問題,或在 coLinux 連上網頁或 BBS 看看。一般性的操作是沒問題了,接下來比較麻煩的大概就是檔案交換吧,這個留待後面再來解決吧,目前還有其他事要做。

基礎設定(二)

又回到基礎設定了。為什麼還需要這一節呢?雖然前面已經把基本的系統都設定妥當,網路也 OK,但啟動時總覺得不方便,執行中也會留下一個 cmd 視窗。總之就是看不順眼,所以需要設定一下啟動方式。coLinux 目前可以作為 Windows 的 service 來啟動 (需要 NT 以上版本),這樣就可以在開機時自動啟動,也不會留下礙眼的 cmd 視窗。

colinux-daemon --install-service -c e:coLinuxcolinux.xml

執行(Win+R)的對話盒執行 services.msc 可以檢查一下是不是有正確安裝:

網路設定(三)

基本上網路是都好了,這一節只是記錄一下方便的小技巧。

我前面有說過我想使用 putty 連線進去,但每次連線都要打密碼有點煩,所以這邊建議改用 public key auth。這樣只要執行 Pageant (putty 附的小程式),把 private 加進來後,以後就不用一直打密碼了。方法如下:

  1. 執行 puttygen.exe,最下面的 type of key to generat 選擇 SSH2 RSA
  2. 按下 Generate 按鈕後會出現進度條,這時在視窗的範圍內隨意移動滑鼠,直到進度跑完
  3. 在 Key passphrase 的地方輸入一個密碼,同時 comfirm 欄位也要填入一樣的密碼,用來保護 private key。輸入無誤後可以按 Save private key 將私鑰存成檔案,這個檔案不可以亂丟,也不能公開,算是個人身份證
  4. 視窗上的 Public key for authorized_keys2 file 欄位會有一堆跟亂碼一樣的字串,全選後複製起來,加入工作站中 ~/.ssh/authorized_keys2 這個檔案中,別忘了這個檔案必需要 chmod 600
  5. 執行 pagenat 後會在 system tray 上出現一個圖示,按滑鼠右鍵選擇 add key,選擇剛剛儲存的 private key 後,會要你輸入一次 passphrase。

往後只要不關掉 pagenat,就不需要再重新輸入 passphrase,同時透過 putty 登入工作站會自動改用 public key 來認證,而不是密碼認證了

另外,我們可以把設定過的 putty session 存起來,這樣只要在桌面上建立一個新的 putty 捷徑,並在命令列的地方加上 "-load <session name>" 就會自動載入設定,使用起來就更方便了。

檔案交換

有這個需求的理由很單純:資源有限,欲望無窮阿 (喂喂∼不是在上經原吧)。Disk image 的大小有其限制,而且塞太多資料,往後備份很不方便。最理想的方式就是把一般資料都放在 Windows 裡,需要特殊屬性的檔案 (如 script 需要設定為可執行) 就可以放在 disk image 中。

要做到檔案交換的方式有很多種,大致上有 (S)FTP、HTTP、NFSsamba 等方案。目標就是兩點:

  1. 在 Windows 的 File Manager 中存取 coLinux 中的檔案。
  2. 從 coLinux 中簡單存取 Windows 端的檔案

Windows -> coLInux

要設置這些服務應該不難,問題在於我不太熟 Windows 的網路設定,所以我只選擇最簡單的方法。要做到第一點只要簡單設定一下 samba 就可以了。先安裝 samba 套件:

apt-get install samba smbclient smbfs libsmbclient samba-common

Debian 的 samba 的設定檔在 /etc/samba/smb.conf,找到以後需要修改一下幾個設定:

[global]
workgroup = your-087df13f91
server string = Henrietta
unix charset = UTF-8

[homes]
browseable = no
writable = yes
create mask = 0600
directory mask = 0700

沒列出來的選項就按照原檔案中的設定不用改。Server String 請自己取,而 workgroup 則是參考 Windows 上設定的 hostname,以後會方便一些:

存檔以後需要重新載入設定:

/etc/init.d/samba reload

但只是這樣還不夠,還需要新增 samba 的帳號密碼:

smbpasswd -a <user>

設定好以後試試從 Windows 連線網路磁碟機,輸入帳號密碼後就可以順利存取個人目錄了。

coLinux -> Windows

接下來是困擾我最久的部份。Windows 上設定分享目錄並不難,但設定好的目錄老是沒辦法讓其他電腦存取。找了很久的資料才知道,原來要指定 Windows 的 hostname,瞭解以後就很簡單了。首先在 Windows 建立一個帳號給 coLinux 使用,比較保險一點還可以設定成不能本機登入或限制其他權限:

設定好分享的目錄後,一開始可以先用 smbclient 測試看看:

smbclient -U <user> -L <netbios name>

看得到分享出來的目錄就算是成功了,可以把設定檔寫到 /etc/fstab,帳號密碼的部份建議統一存到 /etc/samba 裡方便管理。

//host/share /mnt/share smbfs noauto,credentials=/etc/samba/smbpw.host,
ip=192.168.0.1,charset=utf-8,codepage=950,rw,uid=letoh 0 0

密碼檔格式參考 man smbmount。往後就可以方便存取 host 端的資料了。

事實上 coLinux 還提供了一種叫 cofs 的東西可以使用,我試用的結果是很方便,但彈性不太大,更改的話得修改設定檔並重新啟動 coLinux。而且根據 wiki 上的開示,似乎還不太穩定,所以暫時還是先用安全一點的辦法吧。(想嘗試的勇者請自己參考 其他資料)

X 環境

coLinux 據我所知是沒辦法跑 X Server 的,但是可以跑 X client。其實這樣就夠了,只要使用一些可以在 Win32 上使用的 X Server 就可以執行大部份 X 程式。可以使用的方案很多,我目前使用的是 Xming,使用起來很方便,要顯示中文也沒問題 (需要自己安裝字型)。

安裝上不會有問題,但因為 coLinux 跟 host 算是不同機器,比較有問題的可能是 host access list 的設定,不設定的話 X client 會警告 "can't open display"。一般是執行 xhost 加入就好,而 Xming 沒辦法這樣做。找了半天才知道,在 Xming 安裝目錄下有個 X0.hosts 檔案,把 coLinux 的 IP 加進去就可以了,夠簡單了吧。

然後設定好 DISPLAY 變數就可以了:

export DISPLAY=192.168.0.1:0

列印

雖然列印的需求可能不太高,不過如果需要定時印個報表什麼的還是蠻好用的,所以這邊還是介紹一下。

首先 Windows 端要設定 printer 可以分享,而且可以透過前面提過的 smbclient 指令看到。接下來只要把想列印的資料通過 pipe 丟給 smbclient

cat file | smbclient //192.168.0.1/<printer> -U <user> -c "print -"

資料會自動送給 Windows 的 spooler,然後印出來。有的印表機接受 postscript,有的是 pcl,而大部份都可以直接接受純文字資料,所以可以根據需求自己安裝額外的 filter,例如 a2ps 之類的程式。

備份

偶爾想亂玩系統的時候,coLinux 就非常好用了,可以先備份系統,玩壞再還原就好。關於備份的部份可以參考我以前寫過的 這篇文章

結語

完。(既然是筆記就不要太囉嗦了)

參考網址

  1. Tools
  2. Document

2 Responses to "Windows 下的 coLinux 環境設置"

  1. letoh's workshop » txt2tags 輸出 LaTeX 檔測試 Says:

    […] 之前把舊筆記整理了一下,發布了一篇Windows 下的 coLinux 環境設置。在還不會使用 LaTeX 前都是純文字格式的筆記,剛好前陣子也試用了一下 txt2tags 覺得還不錯,因此前一篇文章其實是用 txt2tags 轉成 HTML 後,再透過以前寫的小程式發布到 blog 上。 […]

  2. letoh Says:

    圖好像爛了@@ zooomr 的圖好像掉了不少張…有需要的話請先看 pdf 版,找到原始圖檔再補圖吧XD

 

coLinux 0.7.1 配置(比较实用的技巧)

0 评论  

coLinux 0.7.1 配置(比较实用的技巧) - Tao of programmer - CSDNBlog
来源http://www.djyeh.com/post/1125.html

coLinux可以在Windows下运行,看上去像虚拟 机一样。但实际上,它在Linux内核层次上与Windows系统相结合,因此运行速度相当快,和 在真正硬件上运行没有多大的区别。而且,coLinux还引入cofs的概念,使用它可以在Linux下mount本地Windows的目录,以实现两个 系统的数据交换。

我利用Debian Etch定制了一个系统映像,可以在Climbing提供的空间里下载:

http://nufans.net/upload/linux/grub4dos/debian/

安装说明:

1、下载coLinux-0.7.1-20070326.exe,安装。
2、下载root.rar,swap.rar和colinux.cfg,放到D:\。解压root.rar和swap.rar,生成root.fs和swap.fs。
3、用以下命令可以启动映像中的Linux系统:
colinux-daemon @D:\colinux.cfg

coLinux使用技巧:
1、把coLinux作为服务启动。
可以进入coLinux的安装目录,然后用以下的命令把coLinux安装为服务:
colinux-daemon �-install-service colinux @d:\colinux.cfg
注意,上边install前边是两个横杠。

可以在服务管理器把colinux服务社为自动,那么每次启动Windows时自动启动colinux,也可以使用以下命令手动启动:
net start colinux

2、网络设置
在coLinux内访问网络有三种方式:

1) slirp
这是最简单的方式,coLinux作为一个应用程序,直接使用host的网络。而且,也可以把host上的某些端口映射到colinux上。这种方式的缺点是比较慢,而且某些应用无法实现。例子:

eth0=slirp,,tcp:2222:22/tcp:8080:80

2)tuntap
这是通过一个虚拟的网络设备和coLinux通信。例子:

eth0=tuntap

coLinux内需要访问外部网络的时候,可以在真正的网卡上启动Internet Connection Sharing, 也可以建立Bridge Connection,把真正的网卡和虚拟的网卡连接起来。

3)pcap-bridge
这是利用WinPcap来实现的桥连接。首先要安装WinPCap,然后选择某一本地网络设备进行连接,例子:

eth0=pcap-bridge,Local Area Connection

"Local Area Connection"是进行连接的网络设备的名字。

3、cofs
在配置文件里增加这样一行:

cofs0=D:\

在coLinux内可以使用以下的命令

mount -t cofs cofs0 /mnt/d

这样,coLinux里/mnt/d的内容就是host里的D:\。

可以在fstab里增加以下的一项,使得每次启动coLinux时自动装载/mnt/d

cofs0 /mnt/d cofs defaults 0 0

4、利用ssh登陆coLinux系统。

首先,要建立一个普通用户,ssh是不能使用root来登陆的。

并且,coLinux里要使用静态的IP设置,而不是dhcp,网络配置的信息是在/etc/network/interface文件里。例子:

auto eth0
iface eth0 inet static
address 192.168.0.10
gateway 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcase 192.168.0.255

然后,下载ssh客户端程序,在Windows下可以使用putty。利用putty可以登陆到coLinux系统中。

5、X-Window
在coLinux里也可以运行X-Windows的程序,步骤如下:

1)安装shell:

apt-get install rxvt

当然,这里也可以使用xterm。不过rxvt要小一些。

2)安装X-Window服务器

这里的X-Window服务器是指host里运行的服务器,而不是Linux内的XFree86/X.org服务器。Windows下比较好用的X-Window服务器是XWin32。cygwin里也包含了X-Window服务器,不过我没有使用,不知道效果如何。

3)coLinux内使用静态的IP设置。在这里假设coLinux的IP是192.168.0.10,而tap虚拟网卡的IP是192.168.0.1

4)启动X-Window程序。
可以在coLinux内使用以下命令启动rxvt:

rxvt -ls -display 192.168.0.1:0

如果使用XWin32,还可以建立一个session,在里面填入ssh登陆coLinux的用户,密码和启动命令。这样的话,启动session时就可以直接运行rxvt了。

在rxvt下可以运行其他的X-Window程序。

====================
看了http://colinux.wikia.com/wiki/Main_Page后,才知道colinux没有虚拟显卡,实现不了X,但可以通过C/S模式实现。

但后来想了,如果colinux不装X-windows以及桌面,那怎么实现呢?

但是那个ROOT.FS就是装不上X、RXVT,郁闷之极。

没有办法,只好看http://colinux.wikia.com/wiki/Linux_Distributions自己
重作了个ROOT.FS.咳,真辛苦啊!

然后又看了 http://colinux.wikia.com/wiki/Cy … hing_Cygwin_Xserver
按步骤操作(很漫长的,后来才加了个台湾的源才快些):
apt-get install xorg
dpkg-reconfigure xserver-xorg
apt-get install xfce4
apt-get install vncserver
vncserver :1 -geometry 1024×768 -depth 16

WINDOWS 里面装了个UltraVNC(UltraVNC.sf.org下的),然后连接
debian的IP(192.168.0.2:1,1是刚才在DEBIAN 中设置的端口哦),
天啊,居然成功了,出现了XFCE4的画面。

随后试了下SSH与PUTY的搭配,非常的好啊。字体窗口可以在PUTTY中设置。可以把COLINUX的运行设置成WINDOWS的服务的形式,这样COLINUX用起来就更爽了,连窗口就不要了。

CYGWIN 以及 x-win32还没有试呢。
=============

接上,cygwin,x-win32都是在windows下实现X环境的。cygwin需要安装下载很多东西,配置繁琐;X-WIN32也需要安装重起,并且是商业软件。还有一个XMING需要WIN XP以上系统支持,我用的是2K,没有试用,谁用下说下怎么样。

相 比较而言,还是直接在COLINUX制作的LINUX镜像中实现X环境,利用VNC,比较简单、实在。VNC的WIN客户端体积又小,可以免安装。更关键 的是,LINUX镜像的X-WINDOWS能够实现在WINDOWS下和直接启动下两用;并且可以实现把这些东西都放在大容量U盘中或移动硬盘中,利用 GRUB4DOS和COLINUX稍加配置即随时可实现两用的LINUX,免去硬盘分区安装LINUX的麻烦。

如不要X的话,还是用SSH和PUTTY比较好,或者COLINUX启动时加上"-t nt"在BASH下实现与WINDOWS复制粘贴。

colinux 能在WINDOW下安装各种LINUX,它的WIKI介绍的挺详细的。支持各种分区、光驱、ISO镜像文件等,还有COFS及网络。对了,忘了说下,它在 sourceforge.net上面的那些版本很久没更新了,并且有很多BUG。用http://www.colinux.org/snapshots/ 最新版0.8比较好一些,也方便安装LINUX。

COLINUX比QEMU、VMWARE来安装LINUX占用的系统资源非常少。对于需要用LINUX又离不开WINDOWS的人来说,以及像我这样刚接触LINUX的人来说真是个不错的选择。

LINUX进程相关的知识

0 评论  

Linux 2.4进程调度分析 1

http://www.wangchao.net.cn/bbsdetail_36117.html#t

如何用C遍历unix/linux下的所有进程,取得PID,名称等等


http://www.dochu.org/a-Linux_Development-8-802-1178906.html

一个PS命令,内核模式
http://bbs.chinaunix.net/thread-653764-1-1.html

另一个PS命令,遍历/PROC方式
http://linux.chinaunix.net/bbs/thread-656670-1-1.html

如何遍历所由进程,另一种解释
http://oldlinux.org/oldlinux/viewthread.php?tid=1149


Welcome to lxr.linux.no -- the Linux Cross Reference
http://lxr.linux.no/