坑边闲话:如何在 Word 里添加代码片段呢?这个可以通过 VBA 编程实现,加上某些可以导出 HTML 格式的源码编辑器,基本无缝操作。但是 Word 插入代码并自动更新,真的是让人非常恼火,写完这篇文章,我再回看 Word 中插入代码,简直是地狱般的操作,虽然小代码量不难,也能借助某些操作能做得很好,但是终究不够优雅。那么,$\LaTeX$ 能做到吗?如果能的话,如何在 $\LaTeX$ 里面添加源代码并完美呈现呢?

1. 为什么需要在 $\LaTeX$ 里面添加源码·

有很多时候,我们需要让自己的源代码作为附录写在文章里,比如你的学位论文,再比如你的实验报告。这些时候你单纯写结论上去不是很合适,别人没有你的代码是很难评价你的实验真实性的。

所以源代码必须要有。

1.1 最终 PDF 里面的源代码应该是什么样子的呢·

我个人认为,应该至少满足如下效果:

  1. 代码高亮,而且高亮的颜色可以自己设置;
  2. 代码要使用等宽字体
  3. 字间距也要跟编辑器里的完全一致,我添加几个空格,你就呈现几个空格,自动调节字间距的行为坚决不允许;
  4. 可以支持 include 导入源代码

关于 1~3 很好解释,那就是我们要求 PDF 里的代码片段看起来和公式编辑器里的一模一样。第 4 条可能有人不理解,我在这里解释一下。如果你的论文已经写好,只差粘贴代码进去就搞定,那么你绝对不需要第四条;但是,一旦你觉得有个地方不太对,那你需要在源码里修改,然后再把修改过来的黏贴进来,这就很难受了!你需要找到对应的修改地方,而且手工很难保证自己 $\LaTeX$ 里的代码和工程里的代码完全一致!

2. 终极解决方案·

这里我们采用时下比较火热的 Python 进行演示。

$\LaTeX$ 有个叫做listings的宏包专门解决代码展示问题!用了这个库之后,你的代码至少可以做到如图 1 所示的样子。

图 1:最终的效果。字体严格等宽,代码有自动高亮。

在这里要想到到上面的效果,需要这种命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
\usepackage{listings}
\usepackage{ctex}

% 用来设置附录中代码的样式

\lstset{
basicstyle = \sffamily, % 基本代码风格
keywordstyle = \bfseries, % 关键字风格
commentstyle = \rmfamily\itshape, % 注释的风格,斜体
stringstyle = \ttfamily, % 字符串风格
flexiblecolumns, % 别问为什么,加上这个
numbers = left, % 行号的位置在左边
showspaces = false, % 是否显示空格,显示了有点乱,所以不现实了
numberstyle = \zihao{-5}\ttfamily, % 行号的样式,小五号,tt 等宽字体
showstringspaces = false,
captionpos = t, % 这段代码的名字所呈现的位置,t 指的是 top 上面
frame = lrtb, % 显示边框
}

\lstdefinestyle{Python}{
language = Python, % 语言选 Python
basicstyle = \zihao{-5}\ttfamily,
numberstyle = \zihao{-5}\ttfamily,
keywordstyle = \color{blue},
keywordstyle = [2] \color{teal},
stringstyle = \color{magenta},
commentstyle = \color{red}\ttfamily,
breaklines = true, % 自动换行,建议不要写太长的行
columns = fixed, % 如果不加这一句,字间距就不固定,很丑,必须加
basewidth = 0.5em,
}

只要把上面的这一段代码,粘贴到你的 $\LaTeX$ 导言区域就可以了,当前,前提是你安装了 listings 库,如果没有,请参见我的另一篇文章:如何安装 TeXLive 2020.

现在我来解释一下上面的代码做了些什么。

  1. \usepackage{listings} 不用多说,就是简单地引用库;
  2. \lstset 是对库进行设置,主要是设置某些关键的地方,它含有很多字段;
  3. \lstdefinestyle{Python} 是新定义一个叫做 Python 的样式,到时候直接引用这个设置就可以;
  4. \lstset\lstdefinestyle{Python} 的东西差不多,不同之处就是优先级不同,后者更高,前者是在你没有在 Python 中进行相关设定的时候,为你自动设置的一些东西。总而言之,Python 样式里有的,一定会在 Python 代码里忠实被执行;Python 样式里没有的,系统会检查 \lstset 里有没有相关设置,如果有就用,没有的话就用系统的默认设置。
  5. 其他字符自己看注释

那我如何使用这些设定呢?看代码

1
2
3
4
5
\lstinputlisting[
style = Python,
caption = {\bf ff.py},
label = {ff.py}
]{../src/duke/ff.py}

{../src/duke/ff.py}是我源代码在本系统中相对于 TeX 文件的位置;style选择之前定义过的 Python,label是一个可引用的标签,以后可以使用ref{ff.py}关键字引用这段代码,caption是我要在这个代码上面显示的表头,告诉大家这个代码有关什么东西,\bf 是加粗,没什么其他意思。

再上一个图,看一下长代码行换行。

图 2:长代码换行

结束语·

到这里就结束了,如果你还想知道如何设置 C++、Java 等代码的风格,可以关注我的专栏「修辞与编程」,我会在后期提供方案。如果这篇文章帮助到了你,请点赞支持我,感谢!