有没有办法通过“相对”路径来引用标记的事物?(这是布尔巴基在他们的书中所引用的。)
更准确地说,我使用的是book
s chapter
、section
s 和subsection
s。为了保持简单,假设所有内容都已编号。以下案例说明了我想要的内容:
- 在同一章中对第 1 章的引用应为“本章”,在其他地方对第 1 章的引用应为“第 1 章”。
- 在同一节中对第 1 章第 2 节的引用应为“本节”,在第 1 章内的任何其他地方对第 1 章的引用应为“第 2 节”,其余部分对第 1 章第 2 节的引用应为“第 1 章第 2 节”。
- 在同一小节中对第 1 章第 2 节第 3 小节的引用应为“本小节”,在第 1 章第 2 节的其他地方对第 1 章第 2 节第 3 小节的引用应为“第 3 小节”,在第 1 章的其他地方对第 1 章第 2 节第 3 小节的引用应为“第 1 章第 2 节第 3 小节”。
此外,假设我有theorem
s (通过amsthm
) 散布在整个 (它们不必只出现在subsection
s 中) 中,并在 内编号section
。我希望第 1 章中对定理 2.1 (出现在第 1 章第 2 节第 3 小节中) 的引用被称为“定理 2.1”,而任何其他地方的引用被称为“第 1 章的定理 2.1”。
这能实现吗?
答案1
这是一个概念证明,因为如果标签错误,您将不会收到警告。
在我看来,这种引用风格非常繁琐,对读者来说并不好。
\documentclass{book}
\NewProperty{chapter}{now}{0}{\arabic{chapter}}
\NewProperty{section}{now}{0}{\arabic{section}}
\NewProperty{subsection}{now}{0}{\arabic{subsection}}
\NewDocumentCommand{\chapterlabel}{m}{%
\label{ch:#1}%
\RecordProperties{ch@:#1}{chapter}%
}
\NewDocumentCommand{\sectionlabel}{m}{%
\label{sec:#1}%
\RecordProperties{sec@:#1}{chapter,section}%
}
\NewDocumentCommand{\subsectionlabel}{m}{%
\label{subsec:#1}%
\RecordProperties{subsec@:#1}{chapter,section,subsection}%
}
\ExplSyntaxOn
\NewDocumentCommand{\chapref}{m}
{
\str_if_eq:eeTF { \property_ref:nn { ch@:#1 } { chapter } } { \arabic{chapter} }
{
this~chapter
}
{
chapter\nobreakspace\property_ref:nn { ch@:#1 } { chapter }
}
}
\NewDocumentCommand{\secref}{m}
{
\str_if_eq:eeTF { \property_ref:nn { sec@:#1 } { chapter } } { \arabic{chapter} }
{% we're in the same chapter
\str_if_eq:eeTF { \property_ref:nn { sec@:#1 } { section } } { \arabic{section} }
{% we're in the same section
this~section
}
{% different section, same chapter
section\nobreakspace\property_ref:nn { sec@:#1 } { section }
}
}
{% different chapter
section\nobreakspace\property_ref:nn { sec@:#1 } { section }~
of~chapter\nobreakspace\property_ref:nn { sec@:#1 } { chapter }
}
}
\NewDocumentCommand{\subsecref}{m}
{
\str_if_eq:eeTF { \property_ref:nn { subsec@:#1 } { chapter } } { \arabic{chapter} }
{% we're in the same chapter
\str_if_eq:eeTF { \property_ref:nn { subsec@:#1 } { section } } { \arabic{section} }
{% we're in the same section
\str_if_eq:eeTF { \property_ref:nn { subsec@:#1 } { subsection } } { \arabic{subsection} }
{% we're in the same subsection
this~subsection
}
{% different subsection, same section
subsection\nobreakspace\property_ref:nn { subsec@:#1 } { subsection }
}
}
{% different section, same chapter
subsection\nobreakspace\property_ref:nn { subsec@:#1 } { subsection }~
of~section\nobreakspace\property_ref:nn { subsec@:#1 } { section }
}
}
{% different chapter
subsection\nobreakspace\property_ref:nn { subsec@:#1 } { subsection }~
of~section\nobreakspace\property_ref:nn { subsec@:#1 } { section }~
of~chapter\nobreakspace\property_ref:nn { subsec@:#1 } { chapter }
}
}
\ExplSyntaxOff
\begin{document}
\chapter{Test}\chapterlabel{testchapter1}
\chapref{testchapter1} --- \chapref{testchapter2}
\section{Test}\sectionlabel{testsection1}
\subsection{Test}\subsectionlabel{testsubsection1}
\section{Second}\sectionlabel{testsection2}
A: \secref{testsection1}. B: \secref{testsection2}. C: \secref{testsection3}
\subsection{AAA}\subsectionlabel{testsubsection2}
A: \subsecref{testsubsection1}.
B: \subsecref{testsubsection2}.
C: \subsecref{testsubsection3}.
\chapter{Second}\chapterlabel{testchapter2}
\section{Again}\sectionlabel{testsection3}
\subsection{BBB}\subsectionlabel{testsubsection3}
\end{document}
我们记录了单个的更多属性\...label
,因此我们能够逐一检查它们。