我如何才能将某种风格应用于 C(或者任何其他编程语言)运算符?这样当我写
\begin{lstlistings}[language=C++]
int i = 0;
if(i > 1) {
// do something
}
\end{lstlisting}
比如说,我会得到红色高亮的=
and >
(以及其他运算符,最好还有(
and)
和{
)}
?我设法将这些字符视为其他关键字(在我的情况下为粗体和蓝色),但这不是我想要的行为,而且它破坏了注释定义。
答案1
这是一个解决方法,它不会破坏单行注释,并且只将所需的样式应用于运算符外部注释和字符串。
注意事项:
- 我必须将所有数字定义为“字母”,以防止我的运算符样式应用于它们;这可能会产生相关的副作用。
- 在注释和字符串之外,操作符样式将应用于所有
listings
归类为“其他”的字符。
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\newcommand\opstyle{\color{red}} % <--- customise operator style here
\makeatletter
\lstset
{%
language=C++,
alsoletter=0123456789,% to prevent \opstyle from being applied to digits
}
% Hook into listings
\lst@AddToHook{OutputOther}{\ProcessOther@silmeth}
% helper macro
\newcommand\ProcessOther@silmeth
{%
\ifnum\lst@mode=\lst@Pmode% % If we're in `Processing' mode...
\def\lst@thestyle{\opstyle}% % ... redefine the style locally
\fi%
}
\makeatother
\begin{document}
\begin{lstlisting}[]
int i = 0;
if(i > 1) && (1/2 < 2) {
// one-line comment ()={}><;&
printf("string: ()={}><;&");
/*
block comment ()={}><&;
*/
}
\end{lstlisting}
\end{document}
答案2
好吧,这是一个不太好的方法,不幸的是存在代码重复:
\newcommand{\CodeSymbol}[1]{\textcolor{red}{#1}}
\begin{lstlisting}[language=C++, literate={\{}{{\CodeSymbol{\{}}}1
{\}}{{\CodeSymbol{\}}}}1
{(}{{\CodeSymbol{(}}}1
{)}{{\CodeSymbol{)}}}1
{>}{{\CodeSymbol{$>$}}}1
{=}{{\CodeSymbol{$=$}}}1
{;}{{\CodeSymbol{$;$}}}1]
int i = 0;
if(i > 1) {
// do something
}
\end{lstlisting}
这给出了所需的输出:
例如,该literate
键旨在允许您用 替换->
运算符\to
;在这里,我们滥用它来突出显示。它采用空格分隔的三元组列表,每个三元组的形式如下:。然后 listings 包将用替换符号替换每个符号,并假装它占据{SYMBOL}{{REPLACEMENT}}WIDTH
WIDTH
字符。在这里,我们只是用高亮版本替换符号。不幸的是,在我有限的测试中,我无法将该文本存储在宏中,因此看起来必须手动输入,这是一项繁重的工作。当然,它可以在 中为每个文档指定一次,但即便如此。我猜想和之类的东西不起作用(或者至少在我的测试中不起作用)的\lstset{...}
原因是它们只接受keyword
emph
字, 并不是符号。但是,可以使用 创建不同的关键字和强调类emph={[2]emphasize,this}, emphstyle={[2]\color{red}}
。此外,我对这里的一些语法有点模糊/不精确,所以一定要看看手册。