不一样的 LaTeX 教程:使用 listings 宏包美化代码
简介
LaTeX 中插入代码常用到 listings 宏包。利用 listing 宏包的相关设置可以大幅美化代码。
获得更好的阅读体验,请关注微信公众号:极与客。
代码基础框架
- 引入 listings 宏包。
- 引入 xcolor 宏包,设置可选参数为 dvipsnames。
- 在正文区使用 lstlisting 环境。
\documentclass{ctexart}
\usepackage{listings}
\usepackage[dvipsnames]{xcolor}
% 正文区
\begin{document}
% lstlisting环境
\begin{lstlisting} % Python代码
import random
import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])class FrenchDesk:ranks = [str(n) for n in range(2, 11)] + list('JQKA')suits = 'spades diamonds clubs hearts'.split()def __init__(self):self._cards = [Card(rank, suit) for rank in self.ranks for suit in self.suits]def __len__(self):return len(self._cards)def __getitem__(self, position):return self._cards[position]
desk = FrenchDesk()
\end{lstlisting}
\end{document}
编译结果
注意:以上结果中,代码超出该行时,直接被截断!
设置语言、基础字体族、自动换行
- 可选参数
language
进行语言设置。 - 可选参数
basicstyle = \ttfamliy
,设置为打字机字体族。 - 可选参数
breaklines
进行自动换行。
\documentclass{ctexart}
\usepackage{listings}
\usepackage[dvipsnames]{xcolor}
% 正文区
\begin{document}
% lstlisting环境
\begin{lstlisting}[ % 进行参数设置language=Python, % 设置语言basicstyle=\ttfamily, % 设置字体族breaklines=true % 自动换行
]
import random
import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])class FrenchDesk:ranks = [str(n) for n in range(2, 11)] + list('JQKA')suits = 'spades diamonds clubs hearts'.split()def __init__(self):self._cards = [Card(rank, suit) for rank in self.ranks for suit in self.suits]def __len__(self):return len(self._cards)def __getitem__(self, position):return self._cards[position]
desk = FrenchDesk()
\end{lstlisting}
\end{document}
编译结果
设置语法高亮
1 设置关键字高亮
指定语言后,会有一些默认的关键字。
通过可选参数
keywordstyle
设置关键字样式。通过可选参数
morekeywords
指定更多的关键字。
注意:这里的更多关键字指的是那些在语言中属于关键字,但是没有被 LaTeX 识别。
\documentclass{ctexart}
\usepackage{listings}
\usepackage[dvipsnames]{xcolor}
% 正文区
\begin{document}
% lstlisting环境
\begin{lstlisting}[ % 进行参数设置language=Python, % 设置语言basicstyle=\ttfamily, % 设置字体族breaklines=true, % 自动换行keywordstyle=\bfseries\color{NavyBlue}, % 设置关键字为粗体,颜色为 NavyBluemorekeywords={} % 设置更多的关键字,用逗号分隔
]
import random
import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])class FrenchDesk:ranks = [str(n) for n in range(2, 11)] + list('JQKA')suits = 'spades diamonds clubs hearts'.split()def __init__(self):self._cards = [Card(rank, suit) for rank in self.ranks for suit in self.suits]def __len__(self):return len(self._cards)def __getitem__(self, position):return self._cards[position]
desk = FrenchDesk()
\end{lstlisting}
\end{document}
编译结果
已经顺眼多了!
2 设置强调词高亮
- 可选参数
emph
指定强调词。 - 可选参数
emphstyle
设置强调词样式。
\documentclass{ctexart}
\usepackage{listings}
\usepackage[dvipsnames]{xcolor}
% 正文区
\begin{document}
% lstlisting环境
\begin{lstlisting}[ % 进行参数设置language=Python, % 设置语言basicstyle=\ttfamily, % 设置字体族breaklines=true, % 自动换行keywordstyle=\bfseries\color{NavyBlue}, % 设置关键字为粗体,颜色为 NavyBluemorekeywords={}, % 设置更多的关键字,用逗号分隔emph={self}, % 指定强调词,如果有多个,用逗号隔开emphstyle={\bfseries\color{Rhodamine}} % 强调词样式设置
]
import random
import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])
# 一个叫做 FrenchDesk 的类。a class named FrenchDesk.
class FrenchDesk:ranks = [str(n) for n in range(2, 11)] + list('JQKA')suits = 'spades diamonds clubs hearts'.split()def __init__(self):self._cards = [Card(rank, suit) for rank in self.ranks for suit in self.suits]def __len__(self):return len(self._cards)def __getitem__(self, position):return self._cards[position]
desk = FrenchDesk()
\end{lstlisting}
\end{document}
编译结果
悄悄地在 Python 代码中加了一些注释,但是好像并不美妙。
3 设置注释、字符串样式
- 可选参数
commentstyle
设置注释样式。 - 可选参数
stringstyle
设置字符串样式。
% lstlisting环境
\begin{lstlisting}[ % 进行参数设置language=Python, % 设置语言basicstyle=\ttfamily, % 设置字体族breaklines=true, % 自动换行keywordstyle=\bfseries\color{NavyBlue}, % 设置关键字为粗体,颜色为 NavyBluemorekeywords={}, % 设置更多的关键字,用逗号分隔emph={self}, % 指定强调词,如果有多个,用逗号隔开emphstyle=\bfseries\color{Rhodamine}, % 强调词样式设置commentstyle=\itshape\color{black!50!white}, % 设置注释样式,斜体,浅灰色stringstyle=\bfseries\color{PineGreen!90!black} % 设置字符串样式
]
其他没有显示的代码不变。
编译结果
注释间距很奇怪,我们让它紧凑一些。
4 紧凑一些
- 设置
columns=flexible
。
% lstlisting环境
\begin{lstlisting}[ % 进行参数设置language=Python, % 设置语言basicstyle=\ttfamily, % 设置字体族breaklines=true, % 自动换行keywordstyle=\bfseries\color{NavyBlue}, % 设置关键字为粗体,颜色为 NavyBluemorekeywords={}, % 设置更多的关键字,用逗号分隔emph={self}, % 指定强调词,如果有多个,用逗号隔开emphstyle=\bfseries\color{Rhodamine}, % 强调词样式设置commentstyle=\itshape\color{black!50!white}, % 设置注释样式,斜体,浅灰色stringstyle=\bfseries\color{PineGreen!90!black}, % 设置字符串样式columns=flexible
]
编译结果
注意:注释紧凑的同时,其他代码也紧凑了,但我觉得挺好。
显示行号
- 设置可选参数
numbers
可显示行号,常numbers=left
。 - 可选参数
numbersep
调整行号的具体位置。
% lstlisting环境
\begin{lstlisting}[ % 进行参数设置language=Python, % 设置语言basicstyle=\ttfamily, % 设置字体族breaklines=true, % 自动换行keywordstyle=\bfseries\color{NavyBlue}, % 设置关键字为粗体,颜色为 NavyBluemorekeywords={}, % 设置更多的关键字,用逗号分隔emph={self}, % 指定强调词,如果有多个,用逗号隔开emphstyle=\bfseries\color{Rhodamine}, % 强调词样式设置commentstyle=\itshape\color{black!50!white}, % 设置注释样式,斜体,浅灰色stringstyle=\bfseries\color{PineGreen!90!black}, % 设置字符串样式columns=flexible,numbers=left, % 显示行号在左边numbersep=2em % 设置行号的具体位置
]
编译结果
太糟糕了!行号怎么这么大!
- 通过设置可选参数
numberstyle=\footnotesize
使行号变小。
% lstlisting环境
\begin{lstlisting}[ % 进行参数设置language=Python, % 设置语言basicstyle=\ttfamily, % 设置字体族breaklines=true, % 自动换行keywordstyle=\bfseries\color{NavyBlue}, % 设置关键字为粗体,颜色为 NavyBluemorekeywords={}, % 设置更多的关键字,用逗号分隔emph={self}, % 指定强调词,如果有多个,用逗号隔开emphstyle=\bfseries\color{Rhodamine}, % 强调词样式设置commentstyle=\itshape\color{black!50!white}, % 设置注释样式,斜体,浅灰色stringstyle=\bfseries\color{PineGreen!90!black}, % 设置字符串样式columns=flexible,numbers=left, % 显示行号在左边numbersep=2em, % 设置行号的具体位置numberstyle=\footnotesize % 缩小行号
]
编译结果
感觉很合适。
可以加个边框
- 设置可选参数
frame
可以加一个边框,single
表示单边框。
% lstlisting环境
\begin{lstlisting}[ % 进行参数设置language=Python, % 设置语言basicstyle=\ttfamily, % 设置字体族breaklines=true, % 自动换行keywordstyle=\bfseries\color{NavyBlue}, % 设置关键字为粗体,颜色为 NavyBluemorekeywords={}, % 设置更多的关键字,用逗号分隔emph={self}, % 指定强调词,如果有多个,用逗号隔开emphstyle=\bfseries\color{Rhodamine}, % 强调词样式设置commentstyle=\itshape\color{black!50!white}, % 设置注释样式,斜体,浅灰色stringstyle=\bfseries\color{PineGreen!90!black}, % 设置字符串样式columns=flexible,numbers=left, % 显示行号在左边numbersep=2em, % 设置行号的具体位置numberstyle=\footnotesize % 缩小行号frame=single % 边框
]
编译结果
或许代码有点太靠边框了。
- 可选参数
framesep
改变代码和边框的距离
注意:设置
framesep
移动是边框而非代码!
% lstlisting环境
\begin{lstlisting}[ % 进行参数设置language=Python, % 设置语言basicstyle=\ttfamily, % 设置字体族breaklines=true, % 自动换行keywordstyle=\bfseries\color{NavyBlue}, % 设置关键字为粗体,颜色为 NavyBluemorekeywords={}, % 设置更多的关键字,用逗号分隔emph={self}, % 指定强调词,如果有多个,用逗号隔开emphstyle=\bfseries\color{Rhodamine}, % 强调词样式设置commentstyle=\itshape\color{black!50!white}, % 设置注释样式,斜体,浅灰色stringstyle=\bfseries\color{PineGreen!90!black}, % 设置字符串样式columns=flexible,numbers=left, % 显示行号在左边numbersep=2em, % 设置行号的具体位置numberstyle=\footnotesize, % 缩小行号frame=single, % 边框framesep=1em % 设置边框与代码的距离
]
编译结果
把设置移到导言区
- LaTeX 结构与样式分离,需要避免在正文区进行大量的样式设置。
- 在导言区,
\setlst
命令也可以完成对 lstlisting 环境的设置。
\documentclass{ctexart}
\usepackage{listings}
\usepackage[dvipsnames]{xcolor}
% 在导言区进行样式设置
\lstset{language=Python, % 设置语言basicstyle=\ttfamily, % 设置字体族breaklines=true, % 自动换行keywordstyle=\bfseries\color{NavyBlue}, % 设置关键字为粗体,颜色为 NavyBluemorekeywords={}, % 设置更多的关键字,用逗号分隔emph={self}, % 指定强调词,如果有多个,用逗号隔开emphstyle=\bfseries\color{Rhodamine}, % 强调词样式设置commentstyle=\itshape\color{black!50!white}, % 设置注释样式,斜体,浅灰色stringstyle=\bfseries\color{PineGreen!90!black}, % 设置字符串样式columns=flexible,numbers=left, % 显示行号在左边numbersep=2em, % 设置行号的具体位置numberstyle=\footnotesize, % 缩小行号frame=single, % 边框framesep=1em % 设置代码与边框的距离
}
% 正文区
\begin{document}
% lstlisting环境
\begin{lstlisting}
import random
import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])
# 一个叫做 FrenchDesk 的类。a class named FrenchDesk.
class FrenchDesk:ranks = [str(n) for n in range(2, 11)] + list('JQKA')suits = 'spades diamonds clubs hearts'.split()def __init__(self):self._cards = [Card(rank, suit) for rank in self.ranks for suit in self.suits]def __len__(self):return len(self._cards)def __getitem__(self, position):return self._cards[position]
desk = FrenchDesk()
\end{lstlisting}
\end{document}
这样也有另外一个好处,正文区的每一个 lstlisting 环境都会被设置上相应的样式。针对于特殊情况,我们也可以在特殊的 lstlisting 对相关属性进行重写。
结语
或许在运行本次例子时,你会感觉代码放在了中间并不宽敞的区域。那是因为默认的版心在中间很小的区域。你可以通过以下方法来设置版心为 A4 纸的 80%:
\usepackage{geometry}
\geometry{a4papter,scale=0.8}
本文的所有代码都悄悄地加了此设置。嘻嘻。
不一样的 LaTeX 教程:使用 listings 宏包美化代码相关推荐
- LaTeX中常见的宏包及其含义
LaTeX中常见的宏包及其含义 宏包 含义 metalogo 特殊符号和预定义字符串 mflogo 特殊符号和预定义字符串 texnames 特殊符号和预定义字符串 ulem 字体修饰 identfi ...
- Tikz 作图教程:pgfplots 宏包三维数据的可视化绘图
前一篇推文讲解了使用pgfplots 宏包导入二维数据和可视化绘图的方法.今天我们来介绍一下科研工作者常常用到的三维数据的导入与绘图的方法. 当一个函数关系式中出现了两个自变量时,我们需要用空间曲面来 ...
- 【TikZ 简单学习(下):基础绘制】Latex下的绘图宏包
[TikZ 简单学习[下]:基础绘制]Latex下的绘图宏包 上文 绘制多个节点 给节点添加统一样式 给节点命名 使用相对位置绘制 给节点标签 链接边的绘制 在线边上添加标签 绘制蛇形线和多行文本 层 ...
- Tikz作图教程:pgfplots宏包—三维数据散点图,完美重构文献美图
三组散点实验数据,彼此相差不大,如何对比它们的差异呢?我们来看一幅来自文献的图: 作者别处心裁地将它们画在三维空间的三个平行的平面上,每个平面设置了三种不透明颜色,六条曲线设置不同的颜色.标注,图形下 ...
- Tikz作图教程:pgfplots宏包二维数据可视化的数据导入方法
pgfplots 绘图思想简介 下面一段介绍来自pgfplots说明文档的引言部分,它对pgfplots的绘图思想作了清晰地描述: 科研工作者在交流研究结果.论文时,将数据可视化往往是必要和方便的. ...
- LaTeX之使用parcolumns宏包实现双栏排版示例
在LaTeX中实现双栏或多栏排版的方式有好几种,本文只介绍使用parcolumns宏包来实现. 一.环境 Ubuntu 22.04 XeTeX 3.141592653-2.6-0.999993 二.示 ...
- WinEdt LaTex(三)—— 宏包
amsmath:最常用的数学宏包 1. bm:bold math 数学字体加粗 \documentclass{article} \usepackage{bm} \begin{document} \[ ...
- LaTeX教程(三)——文档格式排版
文章目录 1. 章节目录 1.1 生成章节 1.2 生成目录 2. 交叉引用和脚注 2.1 交叉引用 2.2 脚注 3. 特殊环境 3.1 列表 3.2 文本对齐 3.3 引用环境 3.4 代码环境 ...
- 用latex的tikz宏包mindmap包绘制mindmap
效果展示 使用Latex绘制mindmap虽然不及Xmind等方便,但是足够灵活,如果耐心调节参数,也可以取得非常好看的效果.这里,使用了tikz宏包绘制了直线型的mindmap,如下图所示: 代码部 ...
最新文章
- 习题7-1 选择法排序 (20 分)
- 量子计算技术的研究现状与趋势
- (转)json-lib 的maven dependency
- 【datawhale 】打卡 task 01--深度学习
- maven出现:Failed to execute goal on project ...: Could not resolve dependencies for project ...
- 做外贸如何获取同行的价格体系?转至【【Mr.Harris 原创】
- Android 中的编码与解码
- mssql 查询无记录时sum_只会使用Sum函数求和,那就真的Out了,不信你试试Sumif、Sumifs、Sumproduct等...
- 远程计算机的分辨率调整,手把手教你解决win10系统远程连接设置电脑分辨率的设置方法...
- [js高手之路]从零开始打造一个javascript开源框架gdom与插件开发免费视频教程连载中...
- Angular里ngModel双向绑定的一个使用例子
- Spring学习笔记--导航
- 【BZOJ1607】轻拍牛头,筛一筛
- SpringMVC@RequestMapping请求方法限定与请求参数限定
- (转)什么是Cookies详解
- j结对开发——石家庄地铁查询系统
- 金融区块链底层平台FISCO BCOS白皮书
- 数据库实验五-数据库设计实验
- USB Mass Storage大容量存储的基本知识
- 写首小诗表达我的孤独,独自一个人熬着那些只属于我一个人的夜