使用 lstlisting 突出显示其他关键字和符号

使用 lstlisting 突出显示其他关键字和符号

当我尝试制作我自己风格的 C++ 列表时遇到了问题。

首先,我决定突出显示分号。我在文档中读到

otherkeywords 用于定义 =>、->、-->、--、:: 等关键字。

很好,这就是我需要的:

\documentclass{article}

\usepackage{xcolor}

\definecolor{main-color}{rgb}{0.6627, 0.7176, 0.7764}
\definecolor{back-color}{rgb}{0.1686, 0.1686, 0.1686}
\definecolor{string-color}{rgb}{0.3333, 0.5254, 0.345}
\definecolor{key-color}{rgb}{0.8, 0.47, 0.196}

\usepackage{listings}

\lstdefinestyle{mystyle}
{
    language = C++,
    basicstyle = {\ttfamily \color{main-color}},
    backgroundcolor = {\color{back-color}},
    stringstyle = {\color{string-color}},
    otherkeywords = {;},
    keywordstyle = {\color{key-color}},
}

\begin{document}

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

using namespace std;

int x = 2;

//comment
for (int i = 0; i < x; ++i) {
    cout << "stand_alone_complex" << endl;
}
\end{lstlisting}

\end{document}

效果很好。然后我想用另一种颜色突出显示 << 和 >>。示例的更改部分如下:

\lstdefinestyle{mystyle}
{
    language = C++,
    basicstyle = {\ttfamily \color{main-color}},
    backgroundcolor = {\color{back-color}},
    stringstyle = {\color{string-color}},
    otherkeywords = {;},
    keywordstyle = {\color{key-color}},
    classoffset = 1,
    otherkeywords = {<<, >>},
    morekeywords = {<<, >>},
    keywordstyle = {\color{yellow}},
    classoffset = 0,
}

如果我只保留,otherkeywords = {<<, >>},它会用键色突出显示“<<”、“>>”,而不是黄色。如果我只保留morekeywords = {<<, >>},,它就不起作用了。所以我保留了它们两个,就像这里并且它可以工作,但分号不再突出显示。
似乎otherkeyword只有最后一个才有效。如果我使用下面的代码,则没有任何内容突出显示。

\lstdefinestyle{mystyle}
{
    language = C++,
    basicstyle = {\ttfamily \color{main-color}},
    backgroundcolor = {\color{back-color}},
    stringstyle = {\color{string-color}},
    otherkeywords = {;},
    keywordstyle = {\color{key-color}},
    keywordstyle = [2]{\color{blue}},
    morekeywords = [2]{<<, >>},
    % or otherkeywords = [2]{<<, >>},
    % or both 
}

它是如何工作的?如何用两种不同的颜色突出显示两个不同的符号?

感谢您的帮助。

答案1

据我回忆,正确的otherkeywords的方法是一次性认领所有需要的东西,然后把它们分类放在不同的地方morekeywords=[i]

(更准确地说,otherkeywords不支持[i]-syntax。而且正如您刚才观察到的,它会在第二次调用时删除旧列表。)

正确的斜体是因为手册中没有提到这种用法。它可能会在未来的版本中失效。

以下方法可行

\lstdefinestyle{mystyle}
{
    language = C++,
    basicstyle = {\ttfamily \color{main-color}},
    backgroundcolor = {\color{back-color}},
    stringstyle = {\color{string-color}},
    keywordstyle = {\color{key-color}},
    keywordstyle = [2]{\color{lime}},
    keywordstyle = [3]{\color{yellow}},
    keywordstyle = [4]{\color{teal}},
    otherkeywords = {;,<<,>>,++},
    morekeywords = [2]{;},
    morekeywords = [3]{<<, >>},
    morekeywords = [4]{++},
}


完整代码

\documentclass{article}

\usepackage{xcolor}
\definecolor{main-color}{rgb}{0.6627, 0.7176, 0.7764}
\definecolor{back-color}{rgb}{0.1686, 0.1686, 0.1686}
\definecolor{string-color}{rgb}{0.3333, 0.5254, 0.345}
\definecolor{key-color}{rgb}{0.8, 0.47, 0.196}

\usepackage{listings}

\lstdefinestyle{mystyle}
{
    language = C++,
    basicstyle = {\ttfamily \color{main-color}},
    backgroundcolor = {\color{back-color}},
    stringstyle = {\color{string-color}},
    keywordstyle = {\color{key-color}},
    keywordstyle = [2]{\color{lime}},
    keywordstyle = [3]{\color{yellow}},
    keywordstyle = [4]{\color{teal}},
    otherkeywords = {;,<<,>>,++},
    morekeywords = [2]{;},
    morekeywords = [3]{<<, >>},
    morekeywords = [4]{++},
}

\begin{document}

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

using namespace std;

int x = 2;

//comment
for (int i = 0; i < x; ++i) {
    cout << "stand_alone_complex" << endl;
}
\end{lstlisting}

\end{document}

相关内容