如何在 C 列表中突出显示运算符和括号?

如何在 C 列表中突出显示运算符和括号?

我如何才能将某种风格应用于 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}}WIDTHWIDTH字符。在这里,我们只是用高亮版本替换符号。不幸的是,在我有限的测试中,我无法将该文本存储在宏中,因此看起来必须手动输入,这是一项繁重的工作。当然,它可以在 中为每个文档指定一次,但即便如此。我猜想和之类的东西不起作用(或者至少在我的测试中不起作用)的\lstset{...}原因是它们只接受keywordemph, 并不是符号。但是,可以使用 创建不同的关键字和强调类emph={[2]emphasize,this}, emphstyle={[2]\color{red}}。此外,我对这里的一些语法有点模糊/不精确,所以一定要看看手册

相关内容