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 \label
und \ref
für Querverweise \label
jedes Mal neu geschrieben wird, wenn der Abschnitt (others) erneut in (main) aufgerufen wird, da derselbe \label
Befehl 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}
Und das ist es, was ich will:
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 \newdocumentimport
einenPräfixzu jedem \label
und \ref
(und \pageref
), das sequenziell ist. Auf diese Weise rufen Sie \newdocumentimport
direkt vor dem Importieren eines neuen Dokuments auf und alle \label
s und \ref
erences haben die hinzugefügtenPräfixSie können auch ein festes Präfix erzwingen, indem Sie verwenden \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}
Die obige Option sollte auch funktionieren mithyperref
, da die Speicherung von \label
und \ref
bis \pageref
verzögert wird \AtBeginDocument
.
Für eine automatisierte AbwicklungalleDateien, die importiert wurden mitcatchfilebetweentags
können Sie in Ihrer Präambel Folgendes verwenden:
\usepackage{catchfilebetweentags}
\let\oldExecuteMetaData\ExecuteMetaData
\renewcommand{\ExecuteMetaData}{\newdocumentimport\oldExecuteMetaData}
Dies wird vorangestellt \newdocumentimport
vorjeden \ExecuteMetaData
, sodass Ihr Code so bleibt, wie er ist, ohne dass Sie etwas ändern müssen.