故意多次定义标签

故意多次定义标签

我正在处理一份文档,该文档需要在样式的开头有一个交叉引用部分:

  1. 证据 1 见第 1.1、1.2、1.3 段
  2. 证据2见第1.2、2.3、3.4段

ETC

\label我的文档格式很好,并且可以使用和按照我的意愿准确引用各个段落\ref

但是,我希望能够多次定义一个标签,以便在\ref调用时打印所有标签的列表 - 而不仅仅是最后一个标签(如当前所做的那样)。

我已经考虑过使用索引来实现这一点,但似乎无法让它以其最简单的格式工作,更不用说自定义输出了。

有什么办法可以允许\label多次定义吗?

答案1

在此处输入图片描述

\documentclass{article}

\makeatletter
\def\@newl@bel#1#2#3{{%
  \@ifundefined{#1@#2}%
    {\def\tmp{#3}}%
    {%
\edef\tmp{%
  {\expandafter\expandafter\expandafter\@firstoftwo\csname#1@#2\endcsname,
   \@firstoftwo#3}%
  {\expandafter\expandafter\expandafter\@secondoftwo\csname#1@#2\endcsname,
   \@secondoftwo#3}%
}}%
    \expandafter\xdef\csname#1@#2\endcsname{\tmp}%
}}

\def\@testdef #1#2#3{}
\makeatother

\begin{document}


good stuff in section(s) \ref{a}

bad stuff in section(s) \ref{b}

\section{zz}\label{a}
zz
\section{zzz}\label{a}
zzz
\section{zzzz}\label{a}
zzzz
\section{aaa}\label{b}
aaa
\section{zzzzz}\label{a}
zzzzz

\end{document}

答案2

您不一定必须允许多个标签。除了 @DavidCarlisle 很酷的低级 hack 之外,我还提供了这个解决方案(本质上是一个名为的自定义交叉引用宏\eref{<evidence no>}{<label>}),它循环遍历内部创建的列表:

\documentclass{article}
\usepackage{etoolbox}
\usepackage{lipsum}

\makeatletter
\newcounter{para}
\renewcommand{\thepara}{\thesection.\@arabic\c@para}
\let\svd@paragraph=\paragraph
\renewcommand{\paragraph}{\refstepcounter{para} \svd@paragraph}

\newcommand{\eref}[2]{%
  \ifcsundef{evlist#1}{\@namedef{evlist#1}{}}{}
  \def\process{\def\process{,}}%
  \def\do##1{\process\ref{##1}}%
  \expandafter\listadd\csname evlist#1\endcsname{#2}%
  Evidence #1 found at paragraph
  \expandafter\dolistloop\csname evlist#1\endcsname}
\makeatother

\begin{document}
\section{First Section}
\paragraph{One}\label{para:1}
\lipsum[1]
  \eref{1}{para:1}
\paragraph{Two}\label{para:2}
\lipsum[2]
  \eref{1}{para:2}
\paragraph{Three}\label{para:3}
\lipsum[3]
  \eref{2}{para:3}
\end{document}

\paragraph(请注意,如果您的文档结构中没有使用,则无需使用第 6-9 行。)

相关内容