我希望能够多次应用同一个标签,并有一个引用命令,列出该标签的所有用途。最小示例:
\documentclass{article}
\newcounter{example}
\begin{document}
Warning: Examples
\myref{pessimistic} % 1, 4
are passimistic. Apart from that, only examples
\myref{beginner} % 1, 2
are suitable for beginners.
\refstepcounter{example} \mylabel{beginner} \mylabel{pessimistic}
\refstepcounter{example} \mylabel{beginner} \mylabel{optimistic}
\refstepcounter{example} \mylabel{intermediate}
\refstepcounter{example} \mylabel{expert} \mylabel{pessimistic}
\end{document}
我正在寻找一种实现方法pdflatex
-makeindex
尽可能避免。
是否已有一个可以执行类似操作的软件包 - 或者我该如何实现它?
答案1
以下似乎就是您所追求的:
\documentclass{article}
\makeatletter
% Taken from latex.ltx
\def\@newl@bel#1#2#3{{%
\@ifundefined{#1@#2}%
{\expandafter\xdef\csname rr@#2\endcsname{\@firstoftwo #3}}
{\gdef \@multiplelabels {%
\@latex@warning@no@line{There were multiply-defined labels}}%
\@latex@warning@no@line{Label `#2' multiply defined}
\expandafter\xdef\csname rr@#2\endcsname{\csname rr@#2\endcsname, \@firstoftwo #3}}%
\global\@namedef{#1@#2}{#3}}}
\makeatother
\newcounter{example}
\newcommand{\myref}[1]{\csname rr@#1\endcsname}
\let\mylabel\label
\begin{document}
Warning:
Examples
\myref{pessimistic} % 1, 4
are pessimistic.
Apart from that, only examples
\myref{beginner} % 1, 2
are suitable for beginners.
\refstepcounter{example} \mylabel{beginner} \mylabel{pessimistic}
\refstepcounter{example} \mylabel{beginner} \mylabel{optimistic}
\refstepcounter{example} \mylabel{intermediate}
\refstepcounter{example} \mylabel{expert} \mylabel{pessimistic}
\end{document}
的定义\@newl@bel
取自latex.ltx
\rr@<label>
并更新为为每个创建一个宏\label{<label>}
。如果\rr@<label>
已经存在,则它会附加新标签,否则它只会创建它。引用需要\myref
,而\mylabel
类似于\label
。
这不适用于hyperref
。
标签也可以以逗号分隔列表的形式提供,使用etoolbox
以及 的以下定义\mylabel
。请参阅如何迭代以逗号分隔的列表?更多选项:
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcommand{\mylabel}[1]{% \mylabel{<list of labels>}
\renewcommand*{\do}[1]{\label{##1}}% How to process each item
\docsvlist{#1}}% Process list of items