这次让我们来做一个LaTeX的实例——ACM代码模板。
ACM/ICPC是全球顶尖的算法赛事,比赛时选手可以自带纸质资料,因此我们可以带一些相对不好写、难记忆的算法和数据结构的模板。很多同学会选择用word之类的写模板,但是word实在是不美观了,可能影响赛场心情。这里我来教大家如何写一份属于自己的代码模板。
先附上我比较喜欢的一个ACM大神的代码模板。
那么再附上我们今天做的代码模板的图样:
相比于tls的模板,我写的将大部分转变成了中文,方便阅读。
那么我们开始来写这篇TeX文档吧。
1.常用宏包、环境
文档类型,宏包
\documentclass[twocolumn,a4]{article} %两栏,A4大小
\usepackage{xeCJK} % 中文支持
\usepackage{amsmath, amsthm}
\usepackage{listings,xcolor} %插入代码
\usepackage{geometry} % 设置页边距
\usepackage{fontspec}
\usepackage{graphicx}
\usepackage{fancyhdr} % 自定义页眉页脚
为了节省纸张,所以模板采用两栏形式。
环境参数
\setsansfont{Consolas} % 设置英文字体
\setmonofont[Mapping={}]{Consolas} % 英文引号之类的正常显示,相当于设置英文字体
\geometry{left=1cm,right=1cm,top=2cm,bottom=0.5cm} % 页边距
\setlength{\columnsep}{30pt} %两栏之间的间距大小
% \setlength\columnseprule{0.4pt} % 分割线
\setsansfont和\setmonofont的作用相当于设置英文字体。
\geometry 可以手动调节页边距,这里是将下边距调成0.5,上边距调成2,左右各为1。
\setlength 调节两栏之间的间距大小,如果不调的话生成文档的两栏有重叠。
\setlength 可以生成两栏之间的分割线,默认是关闭的,如果需要可以设置。
2.页眉、页脚、代码格式设置
首先先介绍一下,LaTeX在排版时,缺省的定义了4种页眉页脚的格式:
empty:没有页眉和页脚
plain:没有页眉,页脚中部放置页码。
headings:没有页脚,页眉包含章节的标题和页码。
myheadings:没有页脚,页眉页码和使用者所定义的信息。
article 缺省使用 plain 格式,而 book 则使用 headings 格式。 也可用 \pagestyle 命令在你的文档中设定所用的格式,例如在文档中使用 \pagestyle{empty} 则使得此后的页面没有页眉和页脚。 一般情况下,这四种格式基本可满足排版的要求。但在某些情况下,特别是 使用者想定义自己的页眉和页脚格式时,就会遇到很多限制和麻烦。这时,使用fancyhdr宏包可以很容易地达到目的。
(以上内容来源于这里,需要了解更多请访问。)
页眉、页脚
% 页眉、页脚设置
\pagestyle{fancy}
% \lhead{CUMTB}
\lhead{\CJKfamily{hei} 中国矿业大学(北京)ACM校队}
\chead{}
% \rhead{Page \thepage}
\rhead{\CJKfamily{hei} 第 \thepage 页}
\lfoot{}
\cfoot{}
\rfoot{}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\footrulewidth}{0.4pt}
代码中只保留了页眉的左、右部分,舍弃了页脚(\lfoot,\cfoot,\rfoot)和页眉中间部分(\chead),如有需要可以自行添加。
\CJKfamily{hei} 将后面中文字体的格式为"黑体"。
\thepage 显示当前页数。
\renewcommand 是命令重定义指令,有点类似于C语言中的#define,这里是设置页眉实线(\headrulewidth)和页脚实线(\footrulewidth)的宽度。
代码格式
% 代码格式设置
\lstset{
language = c++,
numbers = left,
numberstyle = \tiny,
breaklines = true,
captionpos = b,
tabsize = 4,
frame = shadowbox,
columns = fullflexible,
commentstyle = \color[RGB]{0,128,0},
keywordstyle = \color[RGB]{0,0,255},
basicstyle = \small\ttfamily,
stringstyle = \color[RGB]{148,0,209}\ttfamily,
rulesepcolor = \color{red!20!green!20!blue!20},
showstringspaces = false,
}
这里是设置生成的代码框的相关属性,比如使用语言,代码颜色,行号,代码框颜色等。需要提前引用\listings宏包。各参数详细定义请查看这里,或者搜索相关文档。
3.标题和目录
标题
包含标题名称、作者、创作时间。
\title{\CJKfamily{hei} \bfseries 中国矿业大学(北京)ACM校队模板}
\author{hymscott}
\renewcommand{\today}{\number\year 年 \number\month 月 \number\day 日}
\bfseries 加粗后面的内容
在生成目录前,我们先加入\begin{document},表示我们的正文从这里开始,在后面生成标题页。
\begin{document}\small
\begin{titlepage}
\maketitle
\end{titlepage}
这里的\begin{titlepage}和\end{titlepage}之间是标题页的内容,建议使用,因为这样在计算页码时不会将标题页计算上去。
目录
\newpage
\pagestyle{empty}
\renewcommand{\contentsname}{目录}
\tableofcontents %生成目录
\newpage\clearpage
\newpage
\pagestyle{fancy}
\setcounter{page}{1} %从当前页开始计算页数
\newpage 是开启新页的指令。
\pagestyle{empty} 在上文中提到过,是去掉当前页(即目录页)的页眉页脚。
\renewcommand{\contentsname}{目录} 是将生成的"Content"改写成中文的"目录"。
\tableofcontents 生成目录
后面的\newpage\clearpage\newpage 是为了防止将正文页与目录页有重叠。
\pagestyle{fancy} 是将后面所有内容采用前面提到的 fancy 的页眉页脚格式。
\setcounter{page}{1} 从当前页(正文)开始计算页数,避免将目录页计算进页数中。
4.正文
正文就看自己的要求了,类似于:
\section{头文件}
\begin{lstlisting}
#include <iostream>
using namespace std;
int main(){
cout<<"Hello,world!"<<endl;
return 0;
}
\end{lstlisting}
每个代码放在\begin{lstlisting}和\end{lstlisting}之间。
记得在正文结束后,加上\end{document}啦。
\end{document}
5.总结
那么我们的ACM代码模板的LaTeX代码已经全部写完了,这样美观的模板在比赛时看应该也会心情愉悦吧。下次用法汇总将提供今年数学建模美赛的论文模板的LaTeX代码~先放几张效果图:
(论文名称和队伍号已去掉。)
下面给出今天的ACM代码模板的完整(除正文外)LaTeX代码,供参考~
%==============================常用宏包、环境==============================%
\documentclass[twocolumn,a4]{article}
\usepackage{xeCJK} % For Chinese characters
\usepackage{amsmath, amsthm}
\usepackage{listings,xcolor}
\usepackage{geometry} % 设置页边距
\usepackage{fontspec}
\usepackage{graphicx}
\usepackage{fancyhdr} % 自定义页眉页脚
\setsansfont{Consolas} % 设置英文字体
\setmonofont[Mapping={}]{Consolas} % 英文引号之类的正常显示,相当于设置英文字体
\geometry{left=1cm,right=1cm,top=2cm,bottom=0.5cm} % 页边距
\setlength{\columnsep}{30pt}
% \setlength\columnseprule{0.4pt} % 分割线
%==============================常用宏包、环境==============================%
%==============================页眉、页脚、代码格式设置==============================%
% 页眉、页脚设置
\pagestyle{fancy}
% \lhead{CUMTB}
\lhead{\CJKfamily{hei} 中国矿业大学(北京)ACM校队}
\chead{}
% \rhead{Page \thepage}
\rhead{\CJKfamily{hei} 第 \thepage 页}
\lfoot{}
\cfoot{}
\rfoot{}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\footrulewidth}{0.4pt}
% 代码格式设置
\lstset{
language = c++,
numbers = left,
numberstyle = \tiny,
breaklines = true,
captionpos = b,
tabsize = 4,
frame = shadowbox,
columns = fullflexible,
commentstyle = \color[RGB]{0,128,0},
keywordstyle = \color[RGB]{0,0,255},
basicstyle = \small\ttfamily,
stringstyle = \color[RGB]{148,0,209}\ttfamily,
rulesepcolor = \color{red!20!green!20!blue!20},
showstringspaces = false,
}
%==============================页眉、页脚、代码格式设置==============================%
%==============================标题和目录==============================%
\title{\CJKfamily{hei} \bfseries 中国矿业大学(北京)ACM校队模板}
\author{hymscott}
\renewcommand{\today}{\number\year 年 \number\month 月 \number\day 日}
\begin{document}\small
\begin{titlepage}
\maketitle
\end{titlepage}
\newpage
\pagestyle{empty}
\renewcommand{\contentsname}{目录}
\tableofcontents
\newpage\clearpage
\newpage
\pagestyle{fancy}
\setcounter{page}{1} %new page
%==============================标题和目录==============================%
%==============================正文部分==============================%
\section{头文件}
\begin{lstlisting}
#include <iostream>
using namespace std;
int main(){
cout<<"Hello,world!"<<endl;
return 0;
}
\end{lstlisting}
%==============================正文部分==============================%
\end{document}