Multiplique definir um rótulo propositalmente

Multiplique definir um rótulo propositalmente

Estou trabalhando em um documento que precisa ter uma seção de referência cruzada no início do estilo:

  1. Evidência 1 encontrada nos parágrafos 1.1, 1.2, 1.3
  2. Evidência 2 encontrada nos parágrafos 1.2, 2.3, 3.4

etc.

Tenho meu documento bem formatado e posso consultar parágrafos individuais exatamente como desejo usando \labele \ref.

No entanto, desejo poder definir um rótulo várias vezes para que, quando \reffor chamado, ele imprima uma lista de todos os rótulos - não apenas o último (como é feito atualmente).

Eu tentei usar o índice para isso, mas não consigo fazê-lo funcionar em seu formato simplista, muito menos com saídas personalizadas.

Existe alguma maneira de permitir \labelser definido várias vezes?

Responder1

insira a descrição da imagem aqui

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

Responder2

Você não precisa necessariamente permitir rótulos múltiplos. Além do hack legal de baixo nível do @DavidCarlisle, forneço esta solução (essencialmente uma macro de referência cruzada personalizada chamada \eref{<evidence no>}{<label>}) que percorre uma lista interna criada:

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

(Observe que você não precisa usar as linhas 6 a 9 se não usar \paragraphna estrutura do documento.)

informação relacionada