我有以下代码片段:
\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
。