definindo o mesmo \label duas vezes

definindo o mesmo \label duas vezes

Estou criando um documento (principal) no qual seções de outros documentos (outros) são frequentemente chamadas. Freqüentemente, a mesma seção de um documento (outros) é chamada em locais diferentes de (principal). O problema que tenho é ao usar \labele \refpara referência cruzada, o \labelé reescrito cada vez que a seção (outros) é chamada novamente em (principal) porque o mesmo \labelcomando ocorre em uma seção diferente (mais adiante). Existe uma maneira de contornar isso?

Por exemplo, o código abaixo fornece a seguinte imagem, que é o que eu não quero:

\documentclass{article}
\usepackage{catchfilebetweentags}

\begin{document}

Hello there.

\ExecuteMetaData[example2]{tag}

\ExecuteMetaData[example2]{tag}

Hello there. 

\end{document}

Onde o outro arquivo, example2 está:

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

insira a descrição da imagem aqui

Onde é isso que eu quero:

insira a descrição da imagem aqui

Não posso alterar o rótulo todas as vezes porque quero apenas recuperar o mesmo documento. Uma solução que pensei seria ter duplicatas dos arquivos importados com rótulos diferentes em cada um deles, mas prefiro não fazer isso (atualizar todos seria entediante).

Responder1

O código a seguir fornece \newdocumentimportque adiciona umprefixopara cada um \labele \ref(e \pageref) isso é sequencial. Dessa forma, você liga \newdocumentimportlogo antes de importar um novo documento e todos \labelos arquivos e \refreferências terão o valor adicionadoprefixo. Você também pode forçar um prefixo fixo usando \setfixedprefix{<prefix>}.

insira a descrição da imagem aqui

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

A opção acima também deve funcionar comhyperref, desde o armazenamento de \label, \refe \pagerefé adiado até \AtBeginDocument.


Para uma maneira automatizada de lidartodosarquivos importados usandocatchfilebetweentags, você pode usar o seguinte em seu preâmbulo:

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

Isso será anexado \newdocumentimportantestodo \ExecuteMetaData, permitindo que seu código permaneça como está sem precisar alterar nada.

informação relacionada