我正在创建一个文档 (main),其中经常调用其他文档 (others) 的部分。文档 (others) 的同一部分经常在 (main) 的不同位置调用。我遇到的问题是,在使用\label
和\ref
进行交叉引用时,\label
每次将 (others) 部分再次调用到 (main) 时,都会重写,因为相同的\label
命令出现在不同的 (更远的) 部分中。有办法解决这个问题吗?
例如,下面的代码给出了下面的图像,这是我不想要的:
\documentclass{article}
\usepackage{catchfilebetweentags}
\begin{document}
Hello there.
\ExecuteMetaData[example2]{tag}
\ExecuteMetaData[example2]{tag}
Hello there.
\end{document}
另一个文件 example2 为:
\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}
这就是我想要的:
我不能每次都更改标签,因为我只想调用相同的文档。我想到的一个解决方案是将要导入的文件复制一份,每份文件都使用不同的标签,但我宁愿不这样做(更新所有文件会很繁琐)。
答案1
下面的代码\newdocumentimport
添加了一个字首到每个\label
和\ref
(和\pageref
)都是连续的。这样,您\newdocumentimport
在导入新文档之前调用,所有\label
s 和\ref
erences 都会添加字首。您还可以使用 强制使用固定前缀\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}
上述选项也适用于hyperref
,自 的存储以来\label
,\ref
并\pageref
延迟到\AtBeginDocument
。
对于自动化处理方式全部使用导入的文件catchfilebetweentags
,您可以在序言中使用以下内容:
\usepackage{catchfilebetweentags}
\let\oldExecuteMetaData\ExecuteMetaData
\renewcommand{\ExecuteMetaData}{\newdocumentimport\oldExecuteMetaData}
这将添加\newdocumentimport
到每一个 \ExecuteMetaData
,让您的代码保持原样,无需更改任何内容。