下面,我尝试在 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 完成。