我希望(手动)为 中的特定行添加彩色背景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}