我想用 突出显示我引用的行的行号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}