
Estoy trabajando en un documento que necesita tener una sección de referencia cruzada al comienzo del estilo:
- Prueba 1 encontrada en el Párrafo 1.1, 1.2, 1.3
- Prueba 2 encontrada en el Párrafo 1.2, 2.3, 3.4
etc.
Tengo mi documento bien formateado y puedo hacer referencia a párrafos individuales exactamente como deseo usando \label
y \ref
.
Sin embargo, deseo poder definir una etiqueta varias veces para que, cuando \ref
se llame, imprima una lista de todas las etiquetas, no solo la última (como se hace actualmente).
He analizado el uso de índice para esto, pero parece que no puedo hacerlo funcionar en su formato simplista, y mucho menos con salidas personalizadas.
¿Hay alguna forma de permitir \label
que se defina varias veces?
Respuesta1
\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}
Respuesta2
No necesariamente es necesario permitir etiquetas múltiples. Además del interesante truco de bajo nivel de @DavidCarlisle, proporciono esta solución (esencialmente una macro de referencia cruzada personalizada llamada \eref{<evidence no>}{<label>}
) que recorre una lista interna creada:
\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}
(Tenga en cuenta que no debe utilizar las líneas 6 a 9 si no las utiliza \paragraph
en la estructura de su documento).