论文杀器LaTeX用法汇总(3)——实战·ACM代码模板

这次让我们来做一个LaTeX的实例——ACM代码模板
ACM/ICPC是全球顶尖的算法赛事,比赛时选手可以自带纸质资料,因此我们可以带一些相对不好写、难记忆的算法和数据结构的模板。很多同学会选择用word之类的写模板,但是word实在是不美观了,可能影响赛场心情。这里我来教大家如何写一份属于自己的代码模板。
先附上我比较喜欢的一个ACM大神的代码模板。

Fig 1

Fig 2

那么再附上我们今天做的代码模板的图样:


Fig 3

Fig 4

Fig 5

相比于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代码~先放几张效果图:

Fig 6

Fig 7

(论文名称和队伍号已去掉。)

下面给出今天的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}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容