工作示例

工作示例

我想为由 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}

输出:

彩色C代码


关于directive选项

我在匹配分隔符时l用替换了。该选项没有明确记录,但我在源代码中找到了它。显然,LaTeX 使用它来强调C 中以 a 开头的关键字(等)。可以改用 ,但这会消除此类关键字的默认行为(在本例中,将它们设置为粗体)。directive#listings##includel

相关内容