我的解决方案

我的解决方案

我希望(手动)为 中的特定行添加彩色背景lstlisting。已经有相当多的答案使用realboxes包或颜色框。但是,我定义的颜色没有显示,并且它会删除我设置的字母颜色。这是一个最低限度的工作示例:

% annotation background colors
\definecolor{blueannoback}{RGB}{51,51,255} % use xcolor package
\definecolor{greenannoback}{RGB}{230,244,214}

\begin{lstfloat}
\begin{lstlisting}[escapeinside={\%*}{*),morecomment=[l][\textcolor{BurntOrange}]{@}]}
%*\colorbox{blueannoback}{@Anno1}*)
%*\colorbox{greenannoback}{@Anno2}*)
@Anno3
public void MyClass {}
\end{lstlisting}\end{lstfloat}

这个想法是,@Anno1、@Anno2 和 @Anno3 具有文本颜色BurntOrange(因为该行以 @ 开头)。此外,@Anno1 应具有浅蓝色背景(理想情况下仅覆盖代码周围,而不是整行),而 @Anno2 应具有绿色背景。

背景颜色正确。但是,@Anno1 和 @Anno2 的文本不再是BurntOrange,大概是因为该行不再以 @ 开头。

此外,注释文本稍微向右移动了一点(我可以接受,但如果能修复这个问题就更好了)。

那么如何在添加背景颜色的同时保留文本颜色?

答案1

我的解决方案

(可选)定义自定义颜色

我首先在中创建了一些自定义颜色mysettings.sty

% annotation background colors
\definecolor{blueannoback}{RGB}{234,242,250}
\definecolor{greenannoback}{RGB}{230,244,214}

我的main.tex文件包含以下包:

\usepackage{xcolor} 
\usepackage{mysettings} 

自定义列表样式

接下来,我为所选的每种编程语言定义一个自定义样式。在此示例中,我定义了一种基于 Java 的自定义语言。

自定义 Java 语言允许我自动为注释的字体添加颜色:

% Define custom Java language
\lstdefinelanguage{custom-java}{
    ...,
    morecomment=[l][\textcolor{BurntOrange}]{@}
}

自定义列表样式提供了一种自定义方式来指定escapeinside以便在我的列表中使用 LateX 命令,我需要:

\lstdefinestyle{my-java-style}{
    language=custom-java,
    ...,
    escapeinside={\%*}{*)}
}

清单

然后我用colorbox将文本包裹在背景中,背景颜色为我选择的颜色。文本需要转义,以便可以在列表内执行 LateX 代码。请注意,这会覆盖焦橙我为以 开头的行定义了字体颜色@

\begin{lstlisting}[style=my-java-style, otherkeywords={this}]
%*\colorbox{blueannoback}{@Entity}*)
%*\colorbox{blueannoback}{@Table(name="CourseCredits")}*)
%*\colorbox{greenannoback}{@Function}*)
public class CourseCredit %*\colorbox{blueannoback}{implements Serializable}*) {
    %*\colorbox{blueannoback}{@Id}*)
    %*\colorbox{blueannoback}{@Column(name="Course")}*)
    %*\colorbox{greenannoback}{@ArgumentType(value=1, typeName="Course")}*)
    private String course;
    %*\colorbox{blueannoback}{@Column(name="Credits")}*)
    %*\colorbox{greenannoback}{@FunctionValue("Credits")}*)
    private int credits;

    public %*\colorbox{blueannoback}{CourseCredit()}*){
    }

    public %*\colorbox{greenannoback}{CourseCredit(String course, int credits)}*){
        this.course = course;
        this.credits = credits;
    }
}\end{lstlisting}

结果

在此处输入图片描述

最小工作示例的完整代码

以下是重现上述图像的完整代码。我尽量保持代码紧凑。

mysettings.sty

% Colors
\definecolor{javapurple}{rgb}{0.5,0,0.35}
\definecolor{blueannoback}{RGB}{234,242,250}
\definecolor{greenannoback}{RGB}{230,244,214}

% Define language
\lstdefinelanguage{my-java}{
    keywords={private,public,class,this}
}

% define style
\lstdefinestyle{my-java-style}{
    language=my-java,
    basicstyle=\footnotesize,   
    captionpos=b,                  
    alsoletter={.},         
    escapeinside={\%*}{*)},       
    extendedchars=true,          
    frame=tb,                     
    keepspaces=true,   
    keywordstyle=\color{javapurple}\bfseries,  
    rulecolor=\color{black},
    tabsize=4
}

main.tex

\documentclass[12pt]{article}

\usepackage[T1]{fontenc}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{mysettings} % my .sty file

\begin{document}

\begin{lstlisting}[style=my-java-style,otherkeywords={this}]
%*\colorbox{blueannoback}{@Entity}*)
%*\colorbox{blueannoback}{@Table(name="CourseCredits")}*)
%*\colorbox{greenannoback}{@Function}*)
public class CourseCredit %*\colorbox{blueannoback}{implements Serializable}*) {
    %*\colorbox{blueannoback}{@Id}*)
    %*\colorbox{blueannoback}{@Column(name="Course")}*)
    %*\colorbox{greenannoback}{@ArgumentType(value=1, typeName="Course")}*)
    private String course;
    %*\colorbox{blueannoback}{@Column(name="Credits")}*)
    %*\colorbox{greenannoback}{@FunctionValue("Credits")}*)
    private int credits;

    public %*\colorbox{blueannoback}{CourseCredit()}*){
    }

    public %*\colorbox{greenannoback}{CourseCredit(String course, int credits)}*){
        this.course = course;
        this.credits = credits;
    }
}\end{lstlisting}

\end{document}

相关内容