minted 环境中的 \refstepcounter 将计数器增加两个

minted 环境中的 \refstepcounter 将计数器增加两个

我想对 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}

在此处输入图片描述

相关内容