我正在为包创建自定义样式lstlisting
,并为某些单词设置一些自定义颜色。我试图定义不同的单词“类别”,其中每个类别都有特定的属性,例如颜色等。如下所示:
名称:class1
关键字:for, int, cout
样式:红色,下划线
名称:class2
关键字:double, std
样式:blue, bold
根据我从其他讨论中了解到的情况,\lstset
必须使用命令和emph
关键字。我有两个问题:
- 如何定义多个类,每个类都有不同的关键字和属性?
- 我如何突出显示诸如
#include
或 之类的内容<iostream>
,而不与代码的其他部分发生冲突(例如在通常有 的循环中<
)?
到目前为止我所拥有的是以下内容:
\documentclass[a4paper]{article}
\usepackage{listings}
\usepackage{color}
%Custom Colors
\definecolor{plainText}{RGB}{74,131,31}
\definecolor{comments}{RGB}{74,131,31}
\definecolor{strings}{RGB}{180,54,34}
\definecolor{numbers}{RGB}{44,45,211}
\definecolor{keywords}{RGB}{160,49,158}
\definecolor{preprocessorStatements}{RGB}{109,75,48}
\definecolor{classNames}{RGB}{101,63,165}
\lstset{frame=tb,
language=C++,
aboveskip=3mm,
belowskip=3mm,
showstringspaces=false,
columns=flexible,
basicstyle={\small\ttfamily},
numbers=left,
numberstyle=\tiny\color{plainText},
keywordstyle=\color{keywords},
commentstyle=\color{comments},
stringstyle=\color{strings},
breaklines=true,
breakatwhitespace=true
tabsize=4
}
\begin{document}
\lstinputlisting[tabsize=4]{main.cpp}
\end{document}
作为示例,您可以使用这个
#include <iostream>
using namespace std;
int main() {
double var1 = 3.2;
int var2 = 3;
for (int i=0; i<var2; i++) {
cout << i << endl;
}
return 0;
}
提前致谢
答案1
您似乎在这里问了几个不相关的问题。在 TeX.SX 上,我们尝试将不相关的问题放在单独的页面上。将来,如果您有多个彼此不相关的问题,您应该在单独的 TeX.SX“问题”中提出每个问题。您将更有可能获得每个问题的满意答案。
让我一一解决您的问题。
风格: 红色,下划线
可以使用包\uline
中提供的宏来为文本添加下划线ulem
。
风格: 蓝色,大胆的
请注意,Computer Modern(LaTeX 使用的默认字体系列)不附带粗体打字机变体。您必须使用其他字体(我在下面使用了 Bera Mono)才能在列表中获得粗体打字机标识符。请参阅在列表内使用粗体/斜体文本?。
如何定义多个类,每个类都有不同的关键字和属性?
这里最好的方法是使用emph
和emphstyle
键。您可以定义多个要突出显示的标识符类,每个类都有自己的样式,方法是为每个类指定不同的正整数。更多详细信息请参阅已接受的答案如何在列表中定义多个标识符类和样式?以及listings
文档的第 2.8 小节。
我如何突出显示诸如
#include
或 之类的内容<iostream>
,而不与代码的其他部分发生冲突(例如在通常有 的循环中<
)?
编译器指令的样式(例如#include
)可以通过directivestyle
键进行定制,这在listings
文档的第 4.6 小节中进行了描述。
默认情况下,标识符中仅允许使用字符a-z
、A-Z
、@
、&
和_
。为了允许标识符中的其他字符,您必须使用键将它们声明为“字母” alsoletter
。TeX.SX 上的相关帖子是添加带有特殊字符的关键字和如何才能使标识符样式应用于‘%’(在 Perl 列表中)?
但是,你必须小心alsoletter
;请参阅接受答案中的旁注改进 listings 包中的 POV 定义。
\documentclass[a4paper]{article}
% The following two lines change the typewriter font of your document
% to Bera Mono, a popular font for listings.
\usepackage[T1]{fontenc}
\usepackage[scaled=0.85]{beramono}
% for underline
\usepackage{ulem}
\usepackage{listings}
\usepackage{color}
% The following block is for writing your listing to
% an external file called main.cpp, in order to make
% the example self-contained.
\usepackage{filecontents}
\begin{filecontents*}{main.cpp}
#include <iostream>
using namespace std;
int main() {
double var1 = 3.2;
int var2 = 3;
for (int i=0; i<var2; i++) {
cout << i << endl;
}
return 0;
}
\end{filecontents*}
%Custom Colors
\definecolor{plainText}{RGB}{74,131,31}
\definecolor{comments}{RGB}{74,131,31}
\definecolor{strings}{RGB}{180,54,34}
\definecolor{numbers}{RGB}{44,45,211}
\definecolor{keywords}{RGB}{160,49,158}
\definecolor{preprocessorStatements}{RGB}{109,75,48}
\definecolor{classNames}{RGB}{101,63,165}
\lstset{
frame=tb,
language=C++,
% You need to declare < and > as "letters" in order to highlight
% words that contain those characters:
alsoletter=<>,
% You can use multiple classes of words to emphasize,
% each with its own style, as follows:
emph = [1]{cout, for, int},
emphstyle = [1]{\color{red}\uline},
emph = [2]{double, std},
emphstyle = [2]{\color{blue}\bfseries},
% The style of compiler directives can be customise via...
directivestyle=\color{magenta}\itshape, % (for instance)
aboveskip=3mm,
belowskip=3mm,
showstringspaces=false,
columns=flexible,
basicstyle={\small\ttfamily},
numbers=left,
numberstyle=\tiny\color{plainText},
keywordstyle=\color{keywords},
commentstyle=\color{comments},
stringstyle=\color{strings},
breaklines=true,
breakatwhitespace=true, % (a comma was missing there)
tabsize=4,
}
\begin{document}
\lstinputlisting[tabsize=4]{main.cpp}
\end{document}