lstlisting:如何给关键字加下划线?

lstlisting:如何给关键字加下划线?

下面,我尝试在 C++ 代码列表中强调关键字“true”。

\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage[lighttt]{lmodern} % bold and italic ttfamily
\usepackage{xcolor}
\usepackage{listings}

\lstset{
    language=C++,
    basicstyle=\ttfamily,
    keywordstyle=\color{blue}\bfseries,
    moredelim=**[is][\underbar]{@}{@}     % <----
}

\begin{document}

\begin{lstlisting}
    int i = foo(@true@);
\end{lstlisting}

\end{document}

我得到的是:

在此处输入图片描述

如果我使用[is]而不是**[is],单词“true”会被加下划线,但在这种情况下它不会作为关键字突出显示。

如何才能给关键字加下划线,而不失去其突出显示?

更新 1:

同时,我想对非关键词进行下划线。例如:

\begin{lstlisting}
    int @i@ = foo(@true@);
\end{lstlisting}

更新 2:

使用\slshape而不是\underbar生成预期的输出。

在此处输入图片描述

为什么\slshape起作用,又\underbar不起作用?

答案1

这里有一个解决方法,你应该在命令中添加 patch\lst@DelimClose和 add\underbar

代码

\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage[lighttt]{lmodern} % bold and italic ttfamily
\usepackage{xcolor}
\usepackage{listings}

\makeatletter

\def\lst@DelimClose#1#2#3\@empty{%
    \lst@TrackNewLines \underbar{\lst@XPrintToken}\relax
    \lst@DelimPrint{#1#2}{#3}%
    \lst@LeaveMode
    \lst@DelimPrint{#1}{#3}}

\makeatother


\begin{document}

\lstset{
    language=C++,
    basicstyle=\ttfamily,
    keywordstyle=\color{blue}\bfseries,
    keepspaces=true,
    moredelim=**[is]{@}{@},    
    }


\begin{lstlisting}
    int i = foo(@true@);
    @hello@, @and@
\end{lstlisting}

\end{document}

答案2

您可以使用[is]\underbar替换\color{blue}\bfseries\underbar

\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage[lighttt]{lmodern} % bold and italic ttfamily
\usepackage{xcolor}
\usepackage{listings}

\lstset{
    language=C++,
    basicstyle=\ttfamily,
    keywordstyle=\color{blue}\bfseries,
    moredelim=[is][\color{blue}\bfseries\underbar]{@}{@}    
}

\begin{document}

\begin{lstlisting}
    int i = foo(@true@);
\end{lstlisting}

\end{document}

结果

在此处输入图片描述


更新

如果您有一个列表,keywords您可以moredelim使用另一个角色创建另一个列表。

\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage[lighttt]{lmodern} % bold and italic ttfamily
\usepackage{xcolor}
\usepackage{listings}




\lstset{
    language=C++,
    basicstyle=\ttfamily,
    keywordstyle=\color{blue}\bfseries,
    moredelim=[is][\color{blue}\bfseries\underbar]{@}{@},    
    moredelim=[is][\underbar]{(*}{*)}
   }

\begin{document}

\begin{lstlisting}
    int i = foo(@true@);
    (*hello*)
\end{lstlisting}

\end{document}

在此处输入图片描述

答案3

供参考,该软件包piton在其环境中提供了一种解决此类问题的简单方法{Piton}:您只需使用\underbar在普通文本中使用的方式(前提是您之前已将其声明\underbar为“检测到的命令” piton)。

\documentclass{article}
\usepackage{piton}
\PitonOptions{detected-commands = underbar}

\begin{document}

\begin{Piton}[language = C]
int i = foo(\underbar{true})
\end{Piton}

\end{document}

编译必须使用 LuaLaTeX 完成。

上述代码的输出

相关内容