如何将可引用的编号圆圈符号添加到代码列表中?

如何将可引用的编号圆圈符号添加到代码列表中?

我使用 \lstinputlisting 来包含源代码部分。我不想添加行号来引用某些特定部分,而是想包含明显不属于源代码本身的唯一符号,即编号圆圈 - 就像此屏幕截图中一样,例如:

在此处输入图片描述

这是来自有效碳作者:Robert C. Seacord,非出版社。我在其他以编程为中心的书籍中也看到过类似的内容。

我该如何设置和引用这些圆形标记?我当然更愿意继续使用 listings 包,但并不严格地局限于此。最重要的是,我不想修改源文件本身。

答案1

您可以扩展抑制列表包中特定行的行号使用circledsteps包(见https://tex.stackexchange.com/a/496665/) 表示行号:

\documentclass{article}
\usepackage{circledsteps}
\pgfkeys{/csteps/inner color=white}
\pgfkeys{/csteps/fill color=black}
\usepackage{listings}

\lstset{numbers=left,numberblanklines=false,escapeinside=||}
\def\origthelstnumber{\Circled{\arabic{lstnumber}}}
\makeatletter
\newcommand*\Suppressnumber{%
  \lst@AddToHook{OnNewLine}{%
    \let\thelstnumber\relax%
     \advance\c@lstnumber-\@ne\relax%
    }%
}

\newcommand*\Reactivatenumber{%
  \lst@AddToHook{OnNewLine}{%
   \let\thelstnumber\origthelstnumber%
   \advance\c@lstnumber\@ne\relax}%
}


\makeatother
\begin{document}
\Suppressnumber
\begin{lstlisting}[language=C]
void func(int arr[5]);
int main(void) {|\Reactivatenumber|
  unsigned int i = 0;|\Suppressnumber|
  unsigned int j = 0;
  int arr[3][5];|\Reactivatenumber|
  func(arr[i]);|\label{someline}|
  int x = arr[i][j];|\label{otherline}\Suppressnumber|
  return 0;
}
\end{lstlisting}
Interesting lines are \Circled{\ref{someline}} and \Circled{\ref{otherline}}.
\end{document}

在此处输入图片描述

当然,这只适用于内联列表,而不适用于\lstinputlisting,因为您需要插入 LaTeX 代码来打开和关闭数字并在列表中手动设置标签。


如果你希望源保持不变,那么你可以使用以下命令精心设计的解决方案基于在 Minted 中跳过行号并从特定数字继续?(这是针对 Minted 的,但对于 Listings 来说,其工作原理大致相同)。在这里,您需要手动设置哪一行获得哪个编号,并手动编号参考资料。

\begin{filecontents*}{matrices.c}
void func(int arr[5]);
int main(void) {
  unsigned int i = 0;
  unsigned int j = 0;
  int arr[3][5];
  func(arr[i]);
  int x = arr[i][j];
  return 0;
}
\end{filecontents*}

\documentclass{article}
\usepackage{circledsteps}
\pgfkeys{/csteps/inner color=white}
\pgfkeys{/csteps/fill color=black}
\usepackage{listings}

\lstset{numbers=left}
\let\origlstnumber\thelstnumber

\def\thelstnumber{%
\ifnum\value{lstnumber}=6\Circled{1}\fi%
\ifnum\value{lstnumber}=7\Circled{2}\fi%
}
\begin{document}
\section*{Selected circled numbers}
\lstinputlisting[language=C]{matrices.c}

Interesting lines are \Circled{1} and \Circled{2}.

\let\thelstnumber\origlstnumber
\section*{Normal numbers}
\lstinputlisting[language=C]{matrices.c}
\end{document}

请注意,C 代码也包含在该文件中,但仅在filecontents用于演示目的的环境中,如果您有原始文件,则没有必要。

在此处输入图片描述

相关内容