布尔巴基风格的“相对”/“条件”引用

布尔巴基风格的“相对”/“条件”引用

有没有办法通过“相对”路径来引用标记的事物?(这是布尔巴基在他们的书中所引用的。)

更准确地说,我使用的是books chaptersections 和subsections。为了保持简单,假设所有内容都已编号。以下案例说明了我想要的内容:

  1. 在同一章中对第 1 章的引用应为“本章”,在其他地方对第 1 章的引用应为“第 1 章”。
  2. 在同一节中对第 1 章第 2 节的引用应为“本节”,在第 1 章内的任何其他地方对第 1 章的引用应为“第 2 节”,其余部分对第 1 章第 2 节的引用应为“第 1 章第 2 节”。
  3. 在同一小节中对第 1 章第 2 节第 3 小节的引用应为“本小节”,在第 1 章第 2 节的其他地方对第 1 章第 2 节第 3 小节的引用应为“第 3 小节”,在第 1 章的其他地方对第 1 章第 2 节第 3 小节的引用应为“第 1 章第 2 节第 3 小节”。

此外,假设我有theorems (通过amsthm) 散布在整个 (它们不必只出现在subsections 中) 中,并在 内编号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,因此我们能够逐一检查它们。

在此处输入图片描述

相关内容