definiendo la misma \label dos veces

definiendo la misma \label dos veces

Estoy creando un documento (principal) en el que a menudo se invocan secciones de otros documentos (otros). A menudo, se invoca la misma sección de un documento (otros) en diferentes ubicaciones de (principal). El problema que tengo es que cuando uso \labely \refpara referencias cruzadas, se \labelreescribe cada vez que se llama nuevamente a la sección (otros) en (principal) porque el mismo \labelcomando ocurre en una sección diferente (más adelante). ¿Hay alguna forma de evitar esto?

Por ejemplo, el siguiente código proporciona la siguiente imagen, que es lo que no quiero:

\documentclass{article}
\usepackage{catchfilebetweentags}

\begin{document}

Hello there.

\ExecuteMetaData[example2]{tag}

\ExecuteMetaData[example2]{tag}

Hello there. 

\end{document}

Donde el otro archivo, ejemplo2 es:

\documentclass{article}
\usepackage{catchfilebetweentags}
\begin{document}

This is some text to fill space. This is some text to fill space.

%<*tag>
\section{Hello}
\subsection{Hello There}\label{1}
\subsubsection{Hello There, as seen in \ref{1}.}
%</tag>

\end{document}

ingrese la descripción de la imagen aquí

Donde esto es lo que quiero:

ingrese la descripción de la imagen aquí

No puedo cambiar la etiqueta cada vez porque solo quiero recuperar el mismo documento. Una solución que se me ocurrió sería tener duplicados de los archivos que se importan con diferentes etiquetas en cada uno de ellos, pero preferiría no hacerlo (actualizarlos todos sería tedioso).

Respuesta1

El siguiente código proporciona \newdocumentimportque agrega unprefijoa cada \labely \ref(y \pageref) que es secuencial. De esa manera usted llama \newdocumentimportjusto antes de importar un nuevo documento y todas \labellas \refreferencias tendrán el agregadoprefijo. También puedes forzar un prefijo fijo usando \setfixedprefix{<prefix>}.

ingrese la descripción de la imagen aquí

\documentclass{article}

% Counter to keep track of new document imports
\newcounter{newdocumentimport}

\AtBeginDocument{
  \let\oldlabel\label% Store \label in \oldlabel
  \let\oldref\ref% Store \ref in \oldref
  \let\oldpageref\pageref% Store \pageref in \oldpageref
}

% Establish a new document import
\newcommand{\newdocumentimport}{%
  \stepcounter{newdocumentimport}%
  \renewcommand{\label}[1]{\oldlabel{\thenewdocumentimport-##1}}%
  \renewcommand{\ref}[1]{\oldref{\thenewdocumentimport-##1}}%
  \renewcommand{\pageref}[1]{\oldpageref{\thenewdocumentimport-##1}}%
}
\newcommand{\setfixedprefix}[1]{%
  \renewcommand{\label}[1]{\oldlabel{#1-##1}}%
  \renewcommand{\ref}[1]{\oldref{#1-##1}}%
  \renewcommand{\pageref}[1]{\oldpageref{#1-##1}}%
}

\begin{document}

\section{Hello}
\subsection{Hello There}\label{1}
\subsubsection{Hey There, as seen in \ref{1}.}

%same document imported again
\newdocumentimport

\section{Hello}
\subsection{Hello There}\label{1}
\subsubsection{Hey There, as seen in \ref{1}.}

\end{document}

La opción anterior también debería funcionar conhyperref, desde el almacenamiento de \label, \refy \pagerefse retrasa hasta \AtBeginDocument.


Para una forma automatizada de manejartodoarchivos importados usandocatchfilebetweentags, puede utilizar lo siguiente en su preámbulo:

\usepackage{catchfilebetweentags}
\let\oldExecuteMetaData\ExecuteMetaData
\renewcommand{\ExecuteMetaData}{\newdocumentimport\oldExecuteMetaData}

Esto antepondrá\newdocumentimport antescada \ExecuteMetaData, permitiendo que su código permanezca como está sin tener que cambiar nada.

información relacionada