前一篇文章,介绍了minted的基本用法和选项,本文件介绍两个有趣的示例,主要通过代码高亮,以及标签引用来实现对代码的某些代码行的重点介绍。
minted宏包提供了大量的选项,可以设置不同的格式。其中代码行号相关也有不少,包括间隔输出行号的方式。然而没有合适的显示指定行号的方式,因此我们通常显示所有的行号,然后把重点要解释的行,用其它方式突出出来,并且可以利用逃逸的latex代码来实现标签和引用。
如下就是一个例子:
\documentclass{article}
\usepackage{fontspec}
\setmainfont{CMU Serif}
\usepackage{ctex}
\usepackage{xcolor}
\usepackage{etoolbox}
\usepackage[colorlinks]{hyperref}
\usepackage{lipsum}
\usepackage[paperwidth=21cm,paperheight=29cm,top=2cm,bottom=2cm,left=3cm,right=3cm]{geometry}
\usepackage{xltxtra,mflogo,texnames}
\usepackage{minted}
\begin{document}
\renewcommand{\theFancyVerbLine}{\sffamily
\textcolor{blue!50!black}{\small\oldstylenums{\arabic{FancyVerbLine}}}}
\begin{minted}%
[encoding=utf8,
linenos,
frame=single,
rulecolor=purple!50!black,
texcl=true,
highlightcolor=green!40,
highlightlines={7,9},
]{python3}
#
#authoryear style
#
def formatlabelauthor(bibentry):
if 'author' in bibentry:
namelist=bibentry['author'] #\label{line:namelist:author}
elif 'editor' in bibentry:
namelist=bibentry['editor'] #\label{line:namelist:editor}
elif 'translator' in bibentry:
namelist=bibentry['translator']
else:
namelist='Anon'
return [namelist,namelist]
\end{minted}
作者姓名赋值见第\ref{line:namelist:author}行,编者姓名赋值见\ref{line:namelist:editor}行。
\end{document}
其中通过highlightlines选项设置,高亮了这两个重点行,并且利用texcl选项,在注释中使用逃逸的latex标签代码,然后在正文中引用。结果如图所示:
由于minted支持在高亮的代码中实现逃逸的latex代码,因此我们不仅仅可以在注释中使用latex代码,也可以直接在代码中使用。
另外,为了直接对指定行进行引用和重点介绍,我们可以利用这种方式实现复杂的效果,下面的代码中我们使用了zref来实现一套新的引用:
\documentclass{article}
\usepackage{ctex}
\usepackage{etoolbox}
\usepackage{xcolor}
\usepackage{hyperref}
\usepackage[paperheight=29cm,paperwidth=21cm,top=2cm,bottom=2cm,left=3cm,right=3cm]{geometry}
\usepackage{minted}
\usepackage[user]{zref}
\usepackage{tcolorbox}
\newtcbox{\codelinenobox}[1][red]{on line,colback=#1!10!white,colframe=#1!50!black,
arc=4.5pt, %圆弧的半径
before upper={\rule[0pt]{0pt}{6pt}},
%调整字符在宽中的位置,[]中负的越多,字符越向上偏离底线
boxrule=0.5pt, %边框线宽
boxsep=0pt,%字符与边框的间距
left=2.5pt,right=2.5pt,top=1.5pt,bottom=1.5pt
}
\newcounter{codelineno}
\setcounter{codelineno}{0}
\renewcommand*{\thecodelineno}{\codelinenobox[blue]{\arabic{codelineno}}}
\makeatletter
\zref@newprop{lineno}{\thecodelineno}
\zref@addprops{main}{lineno}
\newcommand*{\codelineno}[2][]{%
\edef\ref@temp{#1}%
\ifx\ref@temp\@empty\relax%
\stepcounter{codelineno}%
\else%
\setcounter{codelineno}{#1}%
\fi%
\makebox[0pt][c]{\hss\thecodelineno\hspace{10pt}}%
\zlabel{#2}%
}
\makeatother
\begin{document}
\begin{minted}[escapeinside=||,
frame=single,
rulecolor=purple!50!black,
highlightcolor=yellow!50,
highlightlines={7,9},
]{python3}
#
#authoryear style
#
def formatlabelauthor(bibentry):
if 'author' in bibentry:
|\codelineno{line:tex:d}| namelist=bibentry['author']
elif 'editor' in bibentry:
|\codelineno{line:tex:e}| namelist=bibentry['editor']
elif 'translator' in bibentry:
namelist=bibentry['translator']
else:
namelist='Anon'
return [namelist,namelist]
\end{minted}
作者姓名赋值见第\zref[lineno]{line:tex:d}行,编者姓名赋值见\zref[lineno]{line:tex:e}行。
\end{document}
其中,我们在代码第7和9行,利用逃逸代码增加了新的行号标签,然后再正文中引用。标签和引用利用zref宏包实现。行号标签的用tcolorbox画了一个圈。定义的\codelineno
命令,根据输入信息完成了行号的更新,行号标签的输出,以及标签生成。
注意python代码中的|\codelineno{line:tex:d}|
。
结果如图所示:
虽然这里仅给出两个示例,但其实可以利用minted宏包,配合其它宏包,实现更多效果。总的来说,只要有需求,总是能够实现的。
enjoy!