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 \label
y \ref
para referencias cruzadas, se \label
reescribe cada vez que se llama nuevamente a la sección (otros) en (principal) porque el mismo \label
comando 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}
Donde esto es lo que quiero:
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 \newdocumentimport
que agrega unprefijoa cada \label
y \ref
(y \pageref
) que es secuencial. De esa manera usted llama \newdocumentimport
justo antes de importar un nuevo documento y todas \label
las \ref
referencias tendrán el agregadoprefijo. También puedes forzar un prefijo fijo usando \setfixedprefix{<prefix>}
.
\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
, \ref
y \pageref
se 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.