有人知道如何在代码列表中使用标签吗?它看起来类似于以下内容:
我知道使用行号更容易,但我更喜欢使用一些标签。
答案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}
这也应该适用于外部文件而不是嵌入列表。