определение одной и той же \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, позволяя вашему коду оставаться «как есть», без необходимости что-либо менять.

Связанный контент