我想对 minted 中的某些行进行编号并通过交叉引用来引用它。
这是我的代码:
\documentclass{article}
\usepackage{minted}
\newcommand*{\lnumformat}[1]{$\quad\leftarrow$ <#1>}
\newcounter{lnum}
\newcommand{\lnum}[1]{\refstepcounter{lnum}\lnumformat{\arabic{lnum}}\label{#1}}
\newcommand{\lref}[1]{\lnumformat{\ref{#1}}}
\begin{document}
\begin{minted}[breaklines=true,linenos=true,escapeinside=@@]{cpp}
int main() {
printf("hello, world"); @\lnum{line1}@
return 0; @\lnum{line3}@
}
\end{minted}
\end{document}
结果如下:
如您所见,计数器数字增加了 2,而不是 1。我该如何修复它以使其增加 1?
答案1
中的代码@...@
被执行了两次,显然是因为breaklines=true
。
通过在第二遍中执行,您\lnum
只需进行一次步进即可;在第一遍中我们只添加了一个幻影。
\documentclass{article}
\usepackage{minted}
\newcommand*{\lnumformat}[1]{\mbox{$\quad\leftarrow$ <#1>}}
\newcounter{lnum}
\newcommand{\lnum}[1]{%
\ifcsname used@#1\endcsname
\refstepcounter{lnum}\lnumformat{\arabic{lnum}}\label{#1}%
\else
\leavevmode\phantom{\lnumformat{\the\numexpr\value{lnum}+1}}%
\expandafter\gdef\csname used@#1\endcsname{}%
\fi
}
\newcommand{\lref}[1]{\lnumformat{\ref{#1}}}
\begin{document}
\begin{minted}[breaklines=true,linenos=true,escapeinside=@@]{cpp}
int main() {
printf("hello, world"); @\lnum{line1}@
return 0; @\lnum{line3}@
}
\end{minted}
\end{document}