使用转义命令时,列表中的行号错误

使用转义命令时,列表中的行号错误

我正在使用 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}

相关内容