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