代码清单内的标签

代码清单内的标签

有人知道如何在代码列表中使用标签吗?它看起来类似于以下内容:

代码中的标签监听

我知道使用行号更容易,但我更喜欢使用一些标签。

答案1

以下示例llabel为列表的标记定义了一个新的计数器。包pifont用于获取符号,因此标记的范围限制为 1 到 10。否则,tikz可以使用包来绘制自己的符号而不受此限制。

\llabel采用一个符号名称,稍后可用于\ref。它需要在行的开头执行,因为这样它的位置是已知的。标签放在左侧,距离\llabelsep列表行号有一定距离。要\llabel在列表内执行,请使用mathescape包功能。listings

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{pifont}

\makeatletter

\AtBeginDocument{%
  % Counter `lstlisting' is not defined before `\begin{document}'
  \newcounter{llabel}[lstlisting]%
  \renewcommand*{\thellabel}{%
    \ifnum\value{llabel}<0 %
      \@ctrerr
    \else
      \ifnum\value{llabel}>10 %
        \@ctrerr
      \else
        \protect\ding{\the\numexpr\value{llabel}+201\relax}%
      \fi
    \fi
  }%
}
\newlength{\llabelsep}
\setlength{\llabelsep}{5pt}

\newcommand*{\llabel}[1]{%
  \begingroup
    \refstepcounter{llabel}%
    \label{#1}%
    \llap{%
      \thellabel\kern\llabelsep
      \hphantom{\lst@numberstyle\the\lst@lineno}%
      \kern\lst@numbersep
    }%
  \endgroup
}
\makeatother

\begin{document}
\setcounter{section}{2}
\subsection{Hello, world!}  
\begin{lstlisting}[
  language=C,
  numbers=left,
  numberstyle=\small\itshape,
  stepnumber=1,
  frame=lines,
  backgroundcolor=\color{yellow!25},
  mathescape,
]   
$\llabel{header}$#include <stdio.h>

/* This is a comment */
$\llabel{main}$int main()
{
$\llabel{hello}$    printf("Hello, world!\n");
$\llabel{exit}$    return 0;
}

/* Another function */
$\llabel{foobar}$int foobar()
{
    return 0;
}
\end{lstlisting}
We first include the \verb|stdio.h| header file \ref{header}.
We then declare the \verb|main| function \ref{main}.
We then print ``Hello, world!'' \ref{hello}.
Finally, we return value 0 \ref{exit}.
Another function \verb|foobar| is defined in \ref{foobar}.
\end{document}

结果

也可以通过使用特殊标记和选项使源文件继续工作

逃逸内部={/@}{@/}

代替mathescape

/*@\llabel{header}@*/#include <stdio.h>

/* This is a comment */
/*@\llabel{main}@*/int main()
{
/*@\llabel{hello}@*/    printf("Hello, world!\n");
/*@\llabel{exit}@*/    return 0;
}

/* Another function */
/*@\llabel{foobar}@*/int foobar()
{
    return 0;
}

放在\llabel行尾

以下变体允许将\llabel行标记放在源代码行的任何位置,包括行尾,只要它不会破坏格式。为此,行标记也由名称中包含行号的标签记住。然后将标记沿着行号放入numberstyle

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{pifont}

\makeatletter
\AtBeginDocument{%
  % Counter `lstlisting' is not defined before `\begin{document}'
  \newcounter{llabel}[lstlisting]%
  \renewcommand*{\thellabel}{%
    \ifnum\value{llabel}<0 %  
      \@ctrerr
    \else
      \ifnum\value{llabel}>10 %
        \@ctrerr
      \else
        \protect\ding{\the\numexpr\value{llabel}+201\relax}%
      \fi
    \fi  
  }%   
}   
\newlength{\llabelsep}
\setlength{\llabelsep}{5pt}

\newcommand*{\llabel@name}{%
  llabel\the\value{lstlisting}.\the\lst@lineno
}
\newcommand*{\llabel}[1]{%
  \begingroup
    \refstepcounter{llabel}%
    \label{#1}%
    \label{\llabel@name}%
  \endgroup
}
\newcommand*{\llabelput}{%
  \@ifundefined{r@\llabel@name}{%
  }{%
    \ref{\llabel@name}%
    \kern\llabelsep
  }%
}   
\makeatother

\begin{document}
\setcounter{section}{2}
\subsection{Hello, world!}
\begin{lstlisting}[
  language=C,
  numbers=left,
  numberstyle=\small\itshape\llabelput,
  stepnumber=1,
  frame=lines,
  backgroundcolor=\color{yellow!25},
  columns=flexible,
  escapeinside={/*@}{@*/},
]
#include <stdio.h> /*@\llabel{header}@*/

/* This is a comment */
int main() /*@\llabel{main}@*/
{
    printf("Hello, world!\n"); /*@\llabel{hello}@*/
    return 0; /*@\llabel{exit}@*/
}

/* Another function */
int foobar() /*@\llabel{foobar}@*/
{
    return 0;
}   
\end{lstlisting}
We first include the \verb|stdio.h| header file \ref{header}.
We then declare the \verb|main| function \ref{main}.
We then print ``Hello, world!'' \ref{hello}.
Finally, we return value 0 \ref{exit}.
Another function \verb|foobar| is defined in \ref{foobar}.
\end{document}

这也应该适用于外部文件而不是嵌入列表。

相关内容