如何制作#include作为关键词突出显示?

如何制作#include作为关键词突出显示?

我有以下代码片段:

\documentclass{beamer}

% Solarized colors
\definecolor{sbase03}{HTML}{002B36}
\definecolor{sbase02}{HTML}{073642}
\definecolor{sbase01}{HTML}{586E75}
\definecolor{sbase00}{HTML}{657B83}
\definecolor{sbase0}{HTML}{839496}
\definecolor{sbase1}{HTML}{93A1A1}
\definecolor{sbase2}{HTML}{EEE8D5}
\definecolor{sbase3}{HTML}{FDF6E3}
\definecolor{syellow}{HTML}{B58900}
\definecolor{sorange}{HTML}{CB4B16}
\definecolor{sred}{HTML}{DC322F}
\definecolor{smagenta}{HTML}{D33682}
\definecolor{sviolet}{HTML}{6C71C4}
\definecolor{sblue}{HTML}{268BD2}
\definecolor{scyan}{HTML}{2AA198}
\definecolor{sgreen}{HTML}{859900}
\definecolor{myolive}{rgb}{0.51, 0.59, 0.0}

\usepackage{listings}

\lstset{
    % How/what to match
    sensitive=true,
    % Border (above and below)
    frame=tlbr,
    framesep=2pt, % frame border width
    framerule=0pt,% frame border line width
    % Extra margin on line (align with paragraph)
    xleftmargin=\parindent,
    % Put extra space under caption
    belowcaptionskip=1\baselineskip,
    % Colors
    backgroundcolor=\color{sbase3},
    basicstyle=\color{sbase00}\ttfamily,
    keywordstyle=\color{myolive},
    commentstyle=\color{sbase1},
    stringstyle=\color{sblue},
    numberstyle=\color{sviolet}\tiny,
    identifierstyle=\color{sbase02},
    % Break long lines into multiple lines?
    breaklines=true,
    % Show a character for spaces?
    showstringspaces=false,
    tabsize=2
}

\usepackage{fontspec}
\usepackage{microtype}
% we need to define this because otherwise listings won't
% pick up style changes
\newfontface\UMono[Scale=MatchUppercase]{UbuntuMono}

\makeatletter
\lst@InstallKeywords k{attributes}{attributestyle}\slshape{attributestyle}{}ld
\makeatother

\lstdefinestyle{cpp}{
  language=C++,
  basicstyle=\fontsize{7}{7}\UMono,
  alsoletter={\#}, % doesn't work
  moreattributes={main,\#include}, % #include doesn't work
  attributestyle = \color{sblue},
}

\begin{document}

\begin{lstlisting}[style=cpp]
#include <iostream>

int add(int x, int y){
  return x + y;
}

int main(){
  int a = add(1,3);
  std::cout << a << std::endl;
}
\end{lstlisting}

\end{document}

其呈现效果如下:

在此处输入图片描述

我想使#include <stuff>(和#include "stuff.h") 具有不同的颜色/视为不同类型的关键字。

我最接近的方法是使用:

literate={\#include}{{\textcolor{sorange}{\#include}}}7,

在我的风格定义中,但它只有颜色#include

在此处输入图片描述

我该如何实现这一点?我会使用“luatex如果这很重要”这个选项。

答案1

您可以为以 开头的所有行定义新的行注释样式#。然后样式格式将应用到行尾。对文档的相关更改包括:

\lstdefinestyle{cpp}{
  language=C++,
  basicstyle=\fontsize{7}{7}\UMono,
  alsoletter={\#}, % doesn't work
  moreattributes={main},              % <-- Here
  morecomment=[l][\color{scyan}]{\#}, % <-- and here
  attributestyle = \color{sblue},
}

在稍微修改的示例代码中它看起来像这样(请忽略我没有在我的系统上安装您的字体的事实):

在此处输入图片描述

还请注意,#在代码中使用运算符(不确定在 C++ 中是否允许这样做)会使该行的其余部分被突出显示,就像它是预处理器指令一样。除了使用不同的符号并使其看起来像通过键之外,我不知道还有其他解决#方法literate

相关内容