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

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

作者: hymscott | 来源:发表于2018-02-23 12:26 被阅读419次

    这次让我们来做一个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}
    

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/tiitxftx.html