突出显示列表中的行号

突出显示列表中的行号

我想用 突出显示我引用的行的行号lstlistings。我使用转义字符来定义列表中的标签,稍后我会在文档中引用这些标签(例如,参见列表 Y 的 X 行)。

我怎样才能使清单 Y 的 X 行的行号变得彩色呢?

下图显示了它应该是什么样子。这是通过将行号与某个值进行比较而创建的。我想将行号与引用的值进行比较。

它应该是这样的

这是一个 MWE,其中我将行号与硬编码的 5 进行比较。现在我的问题是,如何突出显示我定义标签的行的行号code:label

\documentclass{article}
\usepackage{xcolor}
\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{mauve}{rgb}{0.58,0,0.82}
\usepackage{listings}

% define C++ style
\lstdefinestyle{cppStyle}
{
  basicstyle=\footnotesize,
  tabsize=2,
  captionpos=b,
  frame=lines,
  breaklines=true,
  % language related
  language=C++,
  keywordstyle=\color{blue},
  commentstyle=\color{dkgreen},
  stringstyle=\color{mauve},
  % numbering
  numbers=left,
  numberstyle=\tiny
}

\begin{document}
\begin{lstlisting}[
    style=cppStyle,
    escapeinside={(*@}{@*)},
    caption={Manual Definition -- \emph{Oh, what a mess!}},
    label=lst:notNumbered,
    numberstyle={\ifnum\value{lstnumber}=5\color{green}\fi}
] 
/* #include "readTwoPhaseEulerFoamControls.H" */
#include "readTwoPhaseLESEulerFoamControls.H"

// Solve the Momentum equation (*@\label{code:label}@*)

tmp<fvVectorMatrix> UEqn 
\end{lstlisting}
\end{document}

答案1

@John 的回答应该很有效,而且解释得很好;为了完整起见,这里还有一个替代解决方案。

对我来说,只需替换以下行即可

numberstyle={\ifnum\value{lstnumber}=5\color{green}\fi}

经过

numberstyle={\ifthenelse{\equal{\ref{code:label}}{\value{lstnumber}}}{\color{green}}{}}

\ifthenelse从包中使用ifthen(当然不要忘记相应的\usepackage{ifthen})。

答案2

这有点棘手,因为要突出显示的行号直到文件后面才定义。但是,您可以使用 egreg 先前阐述的想法(https://tex.stackexchange.com/a/49032/25356) 并搭载 LaTeX 现有的标签机制,将信息写入文件.aux以便在编译运行之间保持持久性。

解释

以下\labelline命令将给定的标签与当前行号(由 给出\thelstnumber)关联。

\newcommand\labelline[1]{%
  \def\@currentlabel{\thelstnumber}\label{#1}}

以下\lineref命令从给定的标签中提取值,0如果标签尚未定义则返回。(标签foo在内部存储为命令\r@foo,因此检查是否r@#1已定义。)

\newcommand\lineref[1]{
  \@ifundefined{r@#1}{0}{\ref{#1}}
}

请注意,您需要两次编译器才能解析标签。幸运的是,使用现有的标签基础结构后,编译器将为您提供有关“再次运行 LaTeX 以获取正确引用”的标准提示。

输出

在此处输入图片描述

完整代码

\documentclass{article}
\usepackage{xcolor}
\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{mauve}{rgb}{0.58,0,0.82}
\usepackage{listings}

% define C++ style
\lstdefinestyle{cppStyle}
{
  basicstyle=\footnotesize,
  tabsize=2,
  captionpos=b,
  frame=lines,
  breaklines=true,
  % language related
  language=C++,
  keywordstyle=\color{blue},
  commentstyle=\color{dkgreen},
  stringstyle=\color{mauve},
  % numbering
  numbers=left,
  numberstyle=\tiny
}



\makeatletter
\newcommand\labelline[1]{%
  \def\@currentlabel{\thelstnumber}\label{#1}}
\newcommand\lineref[1]{
  \@ifundefined{r@#1}{0}{\ref{#1}}
}
\makeatother


\begin{document}

\begin{lstlisting}[
    style=cppStyle,
    escapeinside={(*@}{@*)},
    caption={Manual Definition -- \emph{Oh, what a mess!}},
    label=lst:notNumbered,
    numberstyle={\ifnum\value{lstnumber}=\lineref{code:label}\color{green}\fi}
] 
/* #include "readTwoPhaseEulerFoamControls.H" */
#include "readTwoPhaseLESEulerFoamControls.H"

// Solve the Momentum equation (*@ \labelline{code:label} @*)

tmp<fvVectorMatrix> UEqn 
\end{lstlisting}
\end{document}

相关内容