标签 Ubuntu 下的文章

一个基于XeTeX和xeCJK的TeX模板

与"Hello World"作为编程入门时迈出的第一步相似,"Hello TeX"也只是学习博大精深的TeX的一块儿敲门砖,离真正的实用还差的远。

两周前开始体验TeX,直到今天才东拼西凑地倒腾出一个够自己使用的且相对实用的基于XeTeX和xeCJK的小模板。这里分享一下,希望能给大家带来一些帮助,同时对自己也算作是一个备忘。关于TeX网上资料很多,这个模板里的东西也都是参考和融会各种资料并试验后总结而成的。如果你是TeX方面的高手,大可不必理会下面内容^_^。

模板分三个部分:文档声明、序言(Preamble)区和正文(Body)区,下面逐个说:

一、文档声明
\documentclass[a4paper,11pt,titlepage]{book} 
每个TeX文档必须包含的一个命令,用来指定该文档的类型,这里类型是Book,属性:A4纸张,五号字,标题后新启一页。

二、序言(Preamble)区

\usepackage{fontspec}
\usepackage{xunicode}
\usepackage{xltxtra} 

以上是XeTeX的三个主要宏包,类似于C语言的stdio.h, stdlib.h和string.h似的,一般只要使用XeTeX,就都要包含。

\XeTeXinputencoding "GBK"
采用GBK字符编码集,如果你的.tex文件的编码格式是GBK,那么必须包含这行命令,否则xelatex将无法识别.tex文件中的中文字符。另外值得注意的是如果你采用include或input指令来包含其他章节.tex,那么单独章节的.tex文件中也要包含这个命令,否则也会导致xelatex编译出错。

\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt
上面两个命令主要是为了使xelatex在进行中文断行时处理的更美观些。

\usepackage[colorlinks,
            linkcolor=black,
            citecolor=black]{hyperref}
控制文本中的超链接内容的格式。

\usepackage[top=1.2in,bottom=1.2in,left=1.2in,right=1in]{geometry}
页边距设置,这里无须多说了。

\title{\XeTeX\ 日常使用模板\\(基于GBK编码)}
\author{著:Tony Bai\\
        译:Tony Bai\footnote{\url{http://bigwhite.blogbus.com}}}
\date{October, 2010}
以上是封面内容,其中\XeTeX命令定义在xlxtra包中,如果不包含xlxtra,那么xelatex将编译失败。

\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}                                                 
\fancyhead[LE,RO]{\thepage}                               
\fancyhead[RE]{\leftmark}                                
\fancyhead[LO]{\rightmark}                              
\fancypagestyle{plain}{
\fancyhf{}                                             
\renewcommand{\headrulewidth}{0pt}
}
\renewcommand\chaptermark[1]{\markboth{\chaptername~ #1}{}}
\renewcommand\sectionmark[1]{\markright{\thesection~ #1}}
以上是关于页眉页脚设置,基本上是从latex notes中摘录过来,只是最后两行稍作了修改。

\renewcommand{\baselinestretch}{1.25}
设置正文行距。

\usepackage{titlesec}
\titleformat{\chapter}{\centering\huge}{第\thechapter{}章}{1em}{\textbf}
章节格式设置。

% xeCJK设置
\usepackage[slantfont, boldfont, CJKaddspaces]{xeCJK}
\setmainfont{Times New Roman}                              
\setCJKmainfont{SimSun}                                   
\setCJKfamilyfont{song}{SimSun}
\setsansfont{AR PL UKai CN}
目前用到的唯一与xeCJK相关的地方,也没什么可说的。

\renewcommand{\chaptername}{第{\thechapter}章}
\renewcommand{\contentsname}{目~录}
默认情况下,章节的描述是英文的,比如Chapter 1 xx,这里对\chapter作了重定义,将Chapter n改为中文描述”第n章“。

\usepackage[fleqn]{amsmath}
引用数学公式包,默认公式居左。

三、正文(Body)区
考虑到长文档很大,编译一遍消耗时间较长,这里采用\include命令加载其他子模块的tex文件。
\begin{document}

\maketitle                       % 生成title
\include{preface}                % 序言
\tableofcontents                 % 生成目录
\setcounter{tocdepth}{3}         % 设置目录深度
\include{introduction}           % 第一章 导 言

\end{document}

被include的preface.tex和introduction.tex的结构都很简单,以introduction.tex为例:
\XeTeXinputencoding "GBK"                                   % 本文件采用GBK编码

\chapter{导~言}
在这一章节中,…

\section{XX}
在xx

\subsection{XX-1}
在xx-1
\subsection{XX-2}
在xx-2

\section{YY}
在yy
\subsection{YY-1}
在yy-1

再强调一下,如果采用GBK作为.tex文件的内码,那么\XeTeXinputencoding "GBK"这句是必须的,当初被这个问题折磨了半个小时才终于through它。

另外说一下在正文编辑时经常用到的命令:
* 强制对齐
\begin{flushleft}
致谢\\
\end{flushleft}

* 原文照搬
\begin{verbatim}
xxx
\end{verbatim}
如果是内容较短,可以用\verb|xx|。

* 列表
\begin{itemize} or \begin{enumerate}
\item xx
\item yy
\end{itemize}  or \end{enumerate}

这个模板还很简单,诸如索引和附录等都还未考虑。另外由于对XeTeX/LaTeX了解仍不是很透彻,所以模板中不免还有诸多问题,这里就事先打个预防针吧^_^。

完整的模板源文件放置在我的Google code svn库里,可选择下载使用。

关于Makefile.am中与Build相关的变量设置

今天尝试使用autoconf和automake重新构建一个遗留库的Build环境。之前改造的lcut的目录结构还是相对简单,改造时并未遇到什么难题,不过今天就没那么幸运了,我在头文件目录包含设置这个看似简单的环节上遇到了一些小麻烦。

这个库结构其实也没那么复杂,只是源文件和头文件不在一个目录下罢了:
testproj/
    – Makefile.am
    – configure.in
    – include/
        – xx.h
        – yy.h
    – module1
        – xx.c
        – Makefile.am
    – moudle2
        – yy.c
        – Makefile.am
   
开始也没多想,参照以前的经验一步一步生成configure脚本。执行configure脚本生成Makefile文件,敲入make。在进入module1目录后,提示编译xx.c文件失败,无法找到xx.h!看了一下gcc的编译选项,的确没有-I上层的include目录,只有"-I."和"-I.."。翻看了一下automake的manual,发现automake默认情况下是将config.h所在的目录当作-I的参数。我的configure.in中是这样设置的:AC_CONFIG_HEADERS([config.h]),怪不得无法正确设置目录呢!将该句改为AC_CONFIG_HEADERS([include/config.h])后,重新生成Makefile并执行make,这回gcc命令行上出现了"-I../include"的字样,编译也很是顺利。

不过就这样算了,似乎总觉不妥,config.h只有一个,但如果有多个include目录的情况下该如何设置头文件包含目录呢?带着这个问题我再次翻看了automake的手册。老天不负有心人^_^,手册里确有这方面的说明。

原来automake从autoconf里继承了很多编译时需要的变量,诸如CC, CFLAGS, CPPFLAGS, DEFS, LDFLAGS,LIBS等等。但automake也可自己设置一些编译时用到的变量,automake与Build相关的一些变量名字也都以AM_开头,诸如AM_CPPFLAGS(与CPPFLAGS对应)。在Makefile.am中设置头文件包含的方式至少有以下两种:

* 在顶层Makefile.am中设置全局变量
AM_CPPFLAGS = -I $(top_srcdir)/include1
export AM_CPPFLAGS
这样在编译子目录(如module1)时,该全局设置也会起作用,在gcc编译命令行中你会看到-I ../include1。

* 在子目录层Makefile.am中设置局部变量
AM_CPPFLAGS = -I $(top_srcdir)/include2
这里的设置仅仅影响该目录下源文件的编译,对于其他同级目录下的源文件不起作用。另外如果此时顶层的Makefile.am中依然有AM_CPPFLAGS的设置,那么子目录下的Makefile.am中的这些设置会覆盖掉顶层的定义,在gcc编译命令行中也只会看到-I include2而无-I include1。

除了在Makefile.am中手工显式设置外,也可在执行configure脚本的时候通过传入CPPFLAGS参数来设定包含头文件位置,如configure CPPFLAGS=-I./include3。注意"CPPFLAGS"、"="和后面的值之间不能有空格。在automake manual中也有这方面的说明:在命令行中这里的CPPFLAGS将被放到AM_CPPFLAGS后面并一起传给gcc。

对于automake中的其他Build相关的AM_XXFLAGS变量,其道理也是相同的,这里就不赘述了。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 AI原生开发工作流实战 Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com
这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats