我想为由 listings 包格式化的 C 示例中尖括号 (<>) 中包含的头文件的名称着色。在 MWE 中,我<brackets.h>
也想将其变为橙色,就像"quotes.h"
。我不想在每个列表中手动使用转义符来执行此操作,而是全局执行此操作。我尝试了各种粗暴的方法,包括使用keywordcommentsemicolon
(它根本不起作用,因为它是一个未定义的键,尽管它在文档中提到过......是否需要启用它?)。最有希望的结果是通过使用 实现的morecomment=[s]{<}{>}
。但是,这会使<
... 之后的所有内容都变成彩色,这在 C 中并不罕见;)该解决方案应该独立于文档类工作,尤其是 beamer 应该工作,并且最好与常见的列表选项一起工作(即,不更改其他格式化选项的行为,如identifierstyle
。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\definecolor{darkorange}{HTML}{C87B0F}
\usepackage{listings}
\lstset{language=C,captionpos=b}
\lstloadlanguages{C}
\lstset{%
stringstyle=\color{darkorange},
identifierstyle={\color{blue}}.
}
\begin{document}
\begin{lstlisting}[gobble=4]
#include <stdlib.h>
#include "quotes.h"
int main(int argc, char **argv) {
if (argc <= 3)
return 0 > **argv;
return EXIT_SUCCESS;
}
\end{lstlisting}
\end{document}
答案1
笔记:我假设您想要着色的唯一尖括号字符串是那些出现在包含 的行中的字符串#
。如果还有其他情况,我认为我的答案可以调整。
(代码如下。如果愿意,可以跳过解释。)
您无法分辨listings
以 开头的字符串中哪些<
应该着色,哪些不应该着色。但您可以使用基本条件来规避这种情况。
您开始的方向正确。让我们在 上使用分隔符<>
:
moredelim=[s][\coloroncondition]<>
使用\coloroncondition
自定义宏根据自定义条件给出新颜色\ifcoloranglebrackets
:
\newcommand\coloroncondition{\ifcoloranglebrackets\color{darkorange}\fi}
如果我们假设我们想要在包含 的行中为括号着色#
,那么我们可以通过 上的分隔符在这些特定的行中将条件设置为 true #
:
moredelim=**[l][\coloranglebracketstrue]\#
该**
属性listings
会累积该分隔符和其内部任何分隔符的“样式”,因此包含 的行内的尖括号字符串的样式#
将是{\coloranglebracketstrue\coloroncondition}
(最终将扩展为\color{darkorange}
),而任何其他尖括号字符串的样式将是{\coloroncondition}
(将扩展为无)。
工作示例
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\definecolor{darkorange}{HTML}{C87B0F}
\usepackage{listings}
\lstset{language=C,captionpos=b}
\lstloadlanguages{C}
\newif\ifcoloranglebrackets
\coloranglebracketsfalse
\newcommand\coloroncondition{\ifcoloranglebrackets\color{darkorange}\fi}
\lstset{%
stringstyle=\color{darkorange},
moredelim=**[directive][\coloranglebracketstrue]\#,
moredelim=**[s][\coloroncondition]<>
}
\begin{document}
\begin{lstlisting}[gobble=4]
#include <brackets.h>
#include "quotes.h"
std::cout<<text
if a < b ...
\end{lstlisting}
\end{document}
输出:
关于directive
选项
我在匹配分隔符时l
用替换了。该选项没有明确记录,但我在源代码中找到了它。显然,LaTeX 使用它来强调C 中以 a 开头的关键字(等)。可以改用 ,但这会消除此类关键字的默认行为(在本例中,将它们设置为粗体)。directive
#
listings
#
#include
l