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 \label
e \ref
para referência cruzada, o \label
é reescrito cada vez que a seção (outros) é chamada novamente em (principal) porque o mesmo \label
comando 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}
Onde é isso que eu quero:
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 \newdocumentimport
que adiciona umprefixopara cada um \label
e \ref
(e \pageref
) isso é sequencial. Dessa forma, você liga \newdocumentimport
logo antes de importar um novo documento e todos \label
os arquivos e \ref
referências terão o valor adicionadoprefixo. Você também pode forçar um prefixo fixo 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}
A opção acima também deve funcionar comhyperref
, desde o armazenamento de \label
, \ref
e \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 \newdocumentimport
antestodo \ExecuteMetaData
, permitindo que seu código permaneça como está sem precisar alterar nada.