zweimaliges Definieren des gleichen \labels

zweimaliges Definieren des gleichen \labels

Ich erstelle ein Dokument (main), in dem häufig Abschnitte anderer Dokumente (others) aufgerufen werden. Oft wird derselbe Abschnitt eines Dokuments (others) an verschiedenen Stellen von (main) aufgerufen. Das Problem, das ich habe, ist, dass bei der Verwendung von \labelund \reffür Querverweise \labeljedes Mal neu geschrieben wird, wenn der Abschnitt (others) erneut in (main) aufgerufen wird, da derselbe \labelBefehl in einem anderen (weiter hinten liegenden) Abschnitt vorkommt. Gibt es eine Möglichkeit, dies zu umgehen?

Der folgende Code erzeugt beispielsweise das folgende Bild, und das ist genau das, was ich nicht möchte:

\documentclass{article}
\usepackage{catchfilebetweentags}

\begin{document}

Hello there.

\ExecuteMetaData[example2]{tag}

\ExecuteMetaData[example2]{tag}

Hello there. 

\end{document}

Wobei die andere Datei, Beispiel2, lautet:

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

Bildbeschreibung hier eingeben

Und das ist es, was ich will:

Bildbeschreibung hier eingeben

Ich kann das Etikett nicht jedes Mal ändern, da ich nur dasselbe Dokument abrufen möchte. Eine Lösung, die mir in den Sinn gekommen wäre, Duplikate der importierten Dateien mit jeweils unterschiedlichen Etiketten zu haben, aber das möchte ich lieber nicht tun (sie alle zu aktualisieren wäre mühsam).

Antwort1

Der folgende Code fügt \newdocumentimporteinenPräfixzu jedem \labelund \ref(und \pageref), das sequenziell ist. Auf diese Weise rufen Sie \newdocumentimportdirekt vor dem Importieren eines neuen Dokuments auf und alle \labels und \references haben die hinzugefügtenPräfixSie können auch ein festes Präfix erzwingen, indem Sie verwenden \setfixedprefix{<prefix>}.

Bildbeschreibung hier eingeben

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

Die obige Option sollte auch funktionieren mithyperref, da die Speicherung von \labelund \refbis \pagerefverzögert wird \AtBeginDocument.


Für eine automatisierte AbwicklungalleDateien, die importiert wurden mitcatchfilebetweentagskönnen Sie in Ihrer Präambel Folgendes verwenden:

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

Dies wird vorangestellt \newdocumentimportvorjeden \ExecuteMetaData, sodass Ihr Code so bleibt, wie er ist, ohne dass Sie etwas ändern müssen.

verwandte Informationen