我正在使用 listing 包来格式化我的文档中的某些 Java 代码。
我希望它对行进行编号(每 5 行 1 个数字),并且我需要使用以下命令突出显示代码中的某些关键字:
\newcommand{\ca}[1]{\color{red}{#1}}
(在 lstlisting 环境中用“`”转义)。
但是,如果我在任何行上使用此命令,下一行都将被编号,无论其编号是多少。
以下是一个简化的示例:
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\lstset{
language=Java,
numbers=left,
stepnumber=5,
numberfirstline=true,
numbersep=5pt,
escapechar=\`
}
\newcommand{\ca}[1]{\color{red}{#1}}
\begin{document}
\begin{lstlisting}
public class Color {
private int R, G, B;
public `\ca{final static}` Color red = `\ca{new}` Color(255, 0, 0);
public `\ca{final static}` Color magenta = `\ca{new}` Color(255, 0, 255);
public `\ca{final static}` Color lightgray = `\ca{new}` Color(192, 192, 192);
// ...
}
\end{lstlisting}
\end{document}
(在我的真实文档中它要复杂得多:Beamer、TikZ 等)
这是我得到的结果: 第 4 行和第 5 行不应该编号,如果我删除“`”,它们不是编号。
有办法修复吗?是我做错了什么吗,还是列表有错误?
答案1
尝试这个:
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\lstset{
language=Java,
numbers=left,
stepnumber=5,
numberfirstline=true,
numbersep=5pt,
escapechar=\`
}
\makeatletter% ADDED
\newcommand{\ca}[1]{\color{red}{#1}%
\aftergroup\lst@numberfirstlinefalse% ADDED
}
\makeatother% ADDED
\begin{document}
\begin{lstlisting}
public class Color {
private int R, G, B;
public `\ca{final static}` Color red = `\ca{new}` Color(255, 0, 0);
public `\ca{final static}` Color magenta = `\ca{new}` Color(255, 0, 255);
public `\ca{final static}` Color lightgray = `\ca{new}` Color(192, 192, 192);
// ...
}
\end{lstlisting}
\end{document}
答案2
我建议采用一种不同的方法,避免转义为 TeX 代码,并且可以适应不同的情况而无需标记原始代码。
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\lstset{
language=Java,
numbers=left,
stepnumber=5,
numberfirstline=true,
numbersep=5pt,
}
\begin{document}
\begin{lstlisting}[emph={[2]final,static,new},emphstyle={[2]\color{red}}]
public class Color {
private int R, G, B;
public final static Color red = new Color(255, 0, 0);
public final static Color magenta = new Color(255, 0, 255);
public final static Color lightgray = new Color(192, 192, 192);
// ...
}
\end{lstlisting}
\end{document}