latex中minted代码高亮的有趣示例

latex中minted代码高亮的有趣示例

引言

前一篇文章,介绍了minted的基本用法和选项,本文件介绍两个有趣的示例,主要通过代码高亮,以及标签引用来实现对代码的某些代码行的重点介绍。

示例一:完全利用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标签代码,然后在正文中引用。结果如图所示:

latex中minted代码高亮的有趣示例_第1张图片

示例二:利用逃逸代码来进行自定义代码行的引用和介绍

由于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}|
结果如图所示:

latex中minted代码高亮的有趣示例_第2张图片

小结

虽然这里仅给出两个示例,但其实可以利用minted宏包,配合其它宏包,实现更多效果。总的来说,只要有需求,总是能够实现的。

enjoy!

你可能感兴趣的:(科技排版)