Многократно определить метку нарочно

Многократно определить метку нарочно

Я работаю над документом, в начале стиля которого должен быть раздел перекрестных ссылок:

  1. Доказательство 1, найденное в параграфе 1.1, 1.2, 1.3
  2. Доказательство 2, найденное в пунктах 1.2, 2.3, 3.4

и т. д.

Мой документ хорошо отформатирован, и я могу ссылаться на отдельные абзацы именно так, как мне нужно, используя \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 я предлагаю это решение (по сути, пользовательский макрос cross-ref, называемый \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}

(Обратите внимание, что вам не нужно использовать строки 6–9, если вы не используете их \paragraphв структуре документа.)

Связанный контент