利用LaTeX展现C++代码

来源:互联网 发布:js清空input内容兼容ie 编辑:程序博客网 时间:2024/04/30 11:25

最近由于需要在LaTeX中展现C++代码,于是就在网络上搜索别人提供的解决方案。结果大失所望,所搜索出来的LaTeX代码要么不能运行,要么运行结果不符合自己的需要。国内的利用百度进行搜索,国外的利用yahoo进行搜索。最可恨的是有的贴出来的LaTeX代码进行讲解的少,而且前导 (preamble) 中缺失相应的包,浪费了用户的时间。本来想直接利用别人的,反而没有达到应有的效果。这就刺激了我,我花了时间捋捋LaTeX展现代码的机制,终于弄懂了其中的机理,现讲解如下.

1 前导言加入的包

展现代码在LaTeX中需要使用listings包,由于代码中要用不同颜色的字体显示更加好看,又需要xcolor包。LaTeX中的包就像C++语言中的头文件那样,只有引入它们相应的功能才能具备。最终,前导言1应该这样书写:

\usepackage{listings}\usepackage[usenames,dvipsnames]{xcolor}

2 listings包相应的参数设置

我们不做任何设置,也会得到运行结果,但那种结果的展现通常比较单调,不是我们想要的结果。我们在真正使用它之前,必须进行相应的设置才能达到我们需要的效果。真正费工夫的地方正在于此。经过多次调试,我的设置为:

\definecolor{mygreen}{rgb}{0,0.6,0}\definecolor{mygray}{rgb}{0.5,0.5,0.5}\definecolor{mymauve}{rgb}{0.58,0,0.82}\lstset{ backgroundcolor=\color{lightgray},  basicstyle = \footnotesize,        breakatwhitespace = false,         breaklines = true,                  captionpos = b,                     commentstyle = \color{mygreen}\bfseries, extendedchars = false,              frame =shadowbox,  framerule=0.5pt, keepspaces=true, keywordstyle=\color{blue}\bfseries, % keyword style language = C++,                     % the language of code otherkeywords={string},  numbers=left,  numbersep=5pt, numberstyle=\tiny\color{mygray}, rulecolor=\color{black},          showspaces=false,   showstringspaces=false,  showtabs=false,     stepnumber=1,          stringstyle=\color{mymauve},        % string literal style tabsize=2,           title=\lstname                      }

上面的设置中,为了更好的使用颜色,我们定义了三种自定义的颜色,然后在listings的设置中使用它们。上面的设置选项大部分是顾名思义的,我讲解一下比较重要的几个选项的含义,其他的请读者参考相应的资料。

  • basicstyle用来设置代码字体的格式
  • captionpos用来设置代码块标题出现的位置
  • commentstyle用来设置代码中注释的字体格式
  • language用来指定是什么语言的代码,本例使用的是C++
  • numbers用来指定代码块的行号出现的位置或者不出现

注意:上面的设置代码也应该出现的LaTeX的前导言中。

3 LaTeX展现C++的代码及运行结果

在LaTeX代码的正文中属性以下代码:

\begin{lstlisting}[caption={}]#include "randomGenerator.h"void normalNumGen(double mean, double sd,                  int num, string filename){const int nrolls=num; // number of eperimentsdefault_random_engine generator;normal_distribution<double> dnorm(mean, sd);ofstream outfile(filename,ios::out);for(int i=0; i < nrolls; ++i){double number = dnorm(generator);outfile << number << endl;}}\end{lstlisting}

上面是具体使用listings包的方式,你需要将完整的C++代码包含在环境lstlisting中。最后的运行结果如下:
运行结果

4 结束语

该包是很好玩的,更加详细的介绍请参考listings包用户手册。


  1. 所谓前导言,就是大多数LaTeX教科书,国外或者国内的,定义的,在\documentclass以下,\begin{document}以上的那部分区域。 ↩
0 0