定义相同的 \label 两次

定义相同的 \label 两次

我正在创建一个文档 (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在导入新文档之前调用,所有\labels 和\references 都会添加字首。您还可以使用 强制使用固定前缀\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,让您的代码保持原样,无需更改任何内容。

相关内容