列表 - 仅突出显示分隔符之间

列表 - 仅突出显示分隔符之间

我想实现函数名称颜色突出显示,我使用包listings。我的“正则表达式”是,def %s(其中def(包括空格)是第一个分隔符%s,是函数名称,(是第二个分隔符。现在我的目标是用颜色突出显示仅有的 %s用紫色表示。因此基本上我只想触碰分隔符之间的部分,分隔符应该保持不变。

这是我迄今为止尝试过的:

\documentclass{article}
\usepackage{xcolor,listings}
\usepackage[ngerman]{babel}
\usepackage{fontspec}
\setmonofont{Courier New}

\begin{document}

\lstset{language=Python,
    escapebegin=\color{orange},
    keywordstyle=\color{blue}\bfseries,
    commentstyle=\color{orange!80!red},
    stringstyle=\ttfamily\color{gray},
    %moredelim = [is][\color{blue}\bfseries def \mdseries\color{purple}]{def\ }{(},
    moredelim = [s][\color{purple}]{def\ }{(},
    showstringspaces=false}‎
\lstset{literate=%
   *{0}{{{\color{red}0}}}1
    {1}{{{\color{red}1}}}1
    {2}{{{\color{red}2}}}1
    {3}{{{\color{red}3}}}1
    {4}{{{\color{red}4}}}1
    {5}{{{\color{red}5}}}1
    {6}{{{\color{red}6}}}1
    {7}{{{\color{red}7}}}1
    {8}{{{\color{red}8}}}1
    {9}{{{\color{red}9}}}1
}

‎‎\begin{lstlisting}[basicstyle=\ttfamily,mathescape]
def fancy_function_name(page_url = 'tex.stackexchange.com'):
    return page_url.split('.')[0]
\end{lstlisting}

\end{document}

该代码将生成: 在此处输入图片描述

您可以看到它匹配了正确的位置,但太贪婪了,并且也给分隔符上了颜色。所以我想到了取消注释的行: %moredelim = [is][\color{blue}\bfseries def \mdseries\color{purple}]{def\ }{(}, 如果我使用这一行并取消注释下面的行,我会得到这个结果:

在此处输入图片描述

这几乎就是我想要的,但我无法添加最后一个,现在(黑色不见了。

有没有人能解决这个问题,而无需预先修改代码并添加所有@@符号?

答案1

您可以定义自己的命令,采用一个参数并在打印该参数之前和之后添加适当的字符:

\documentclass{article}
\usepackage{xcolor,listings}
\usepackage[ngerman]{babel}
%\usepackage{fontspec}
%\setmonofont{Courier New}

\begin{document}

\newcommand{\functionDefHighlight}[1]{\bfseries\textcolor{blue}{def} \textcolor{purple}{\mdseries #1}(}

\lstset{language=Python,
    escapebegin=\color{orange},
    keywordstyle=\color{blue}\bfseries,
    commentstyle=\color{orange!80!red},
    stringstyle=\ttfamily\color{gray},
    %moredelim = [is][\color{blue}\bfseries def \mdseries\color{purple}]{def\ }{(},
    %moredelim = [s][\color{purple}]{def\ }{(},
    moredelim = [is][\functionDefHighlight]{def\ }{(},
    showstringspaces=false}‎
\lstset{literate=%
   *{0}{{{\color{red}0}}}1
    {1}{{{\color{red}1}}}1
    {2}{{{\color{red}2}}}1
    {3}{{{\color{red}3}}}1
    {4}{{{\color{red}4}}}1
    {5}{{{\color{red}5}}}1
    {6}{{{\color{red}6}}}1
    {7}{{{\color{red}7}}}1
    {8}{{{\color{red}8}}}1
    {9}{{{\color{red}9}}}1
}

‎‎\begin{lstlisting}[basicstyle=\ttfamily,mathescape]
def fancy_function_name(page_url = 'tex.stackexchange.com'):
    return page_url.split('.')[0]
\end{lstlisting}

\end{document}

打印结果屏幕

相关内容