Definieren Sie ein Label gezielt mehrfach

Definieren Sie ein Label gezielt mehrfach

Ich arbeite an einem Dokument, das am Anfang des Stils einen Abschnitt mit Querverweisen enthalten muss:

  1. Beweis 1 findet sich in den Absätzen 1.1, 1.2, 1.3
  2. Beweis 2 in Absatz 1.2, 2.3, 3.4

usw

\labelIch habe mein Dokument gut formatiert und kann mit und genau nach Wunsch auf einzelne Absätze verweisen \ref.

Ich möchte jedoch ein Etikett mehrmals definieren können, sodass beim \refAufruf eine Liste aller Etiketten gedruckt wird – und nicht nur das letzte (wie es derzeit der Fall ist).

Ich habe mir die Verwendung eines Index hierfür angesehen, aber ich schaffe es nicht, ihn im einfachsten Format zum Laufen zu bringen, geschweige denn mit benutzerdefinierten Ausgaben.

Gibt es eine Möglichkeit, \labeleine mehrfache Definition zu ermöglichen?

Antwort1

Bildbeschreibung hier eingeben

\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}

Antwort2

Sie müssen nicht unbedingt mehrere Labels zulassen. Zusätzlich zu @DavidCarlisles coolem Low-Level-Hack biete ich diese Lösung an (im Wesentlichen ein benutzerdefiniertes Cross-Ref-Makro namens \eref{<evidence no>}{<label>}), das eine Schleife über eine intern erstellte Liste durchführt:

\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}

(Beachten Sie, dass Sie die Zeilen 6–9 nicht verwenden müssen, wenn Sie sie nicht \paragraphin Ihrer Dokumentstruktur verwenden.)

verwandte Informationen