根据我们是否在同一部分/章节/节中使用不同的交叉引用

根据我们是否在同一部分/章节/节中使用不同的交叉引用

考虑这个基本文件

\part{Alpha}
  \chapter{Beginning A}
    \section{Early Beginning A} \label{eba}
    \section{Late Beginning A}
        #1 See \myref{eba} then \myref{lea}
  \chapter{End A}
    \section{Early End A}
        #2 See \myref{eba} then \myref{lea}
    \section{Late End A}        \label{lea}
\part{Beta}
  \chapter{Beginning B}
    \section{Early Beginning B}
    \section{Late Beginning B}}
        #3 See \myref{eba} then \myref{lea}
  \chapter{End B}
    \section{Early End B}
    \section{Late End B}
        #3 See \myref{eba} then \myref{lea}

我想myref根据标签与调用位置共享的上下文量来生成不同级别的上下文。

我该如何编写才能myref使输出结果像这样?

第一部分:Alpha

第 1 章:开始

1.1 早期开始

1.2 晚期开始

#1 参见第 1 节,然后参见第 2 章第 2 节

第 2 章:结局 A

2.1 提前结束A

#2 参见第 1 章第 1 节,然后参见第 2 节

第二部分:测试版

第 1 章:开始 B

1.1 早期开始 B

1.2 晚开始 B

#3 参见第一部分第 1 章第 1 节,然后参见第一部分第 2 章第 2 节

第 2 章:结局 B

1.1 提前结束 B

1.2 后期 B

#3 参见第一部分第 1 章第 1 节,然后参见第一部分第 2 章第 2 节

因此基本上myref会产生

  • Section X如果它是在同一部分的同一章中调用的,

  • Chapter X Section Y如果它在同一部分的不同章节中被调用,

  • Part X Chapter Y Section Z如果它是从不同的部分调用的。

我该如何写这样的东西?谢谢。

答案1

这是我在此处给出的答案的类似版本(但有所扩展)

https://tex.stackexchange.com/a/347161/31729

基本上,它归结为将部分、章节和部分计数器值存储到.aux并使用包检索它们zref

\documentclass{book}

\usepackage[counter,user,hyperref]{zref}

\makeatletter
\AtBeginDocument{%
\@ifpackageloaded{hyperref}{%
}{
  \providecommand{\phantomsection}{}
  \providecommand{\hyperlink}[2]{#2}
}

\zref@newlist{sectionprop}
\zref@newprop{partinfo}[-1]{\thepart}
\zref@newprop{chapterinfo}[-1]{\thechapter}
\zref@newprop{sectioninfo}[-1]{\thesection}

\newcommand{\contextlabel}[1]{%
  \zref@labelbyprops{#1}{partinfo,chapterinfo,sectioninfo,anchor,counter}%
}

% Wrapper macros that extract the reference counter type and the reference value -- this way, no additional \label is necessary

\newcommand{\countercref}[1]{%
  \expandafter\csname cref@\zref@extract{#1}{counter}@name\endcsname\ \hyperlink{\zref@extract{#1}{anchor}}{\zref@extract{#1}{sectioninfo}}%
}

\newcommand{\Countercref}[1]{%
  \expandafter\csname Cref@\zref@extract{#1}{counter}@name\endcsname\ \hyperlink{\zref@extract{#1}{anchor}}{\zref@extract{#1}{sectioninfo}}%
}


\newcommand{\contextref}[1]{%
  % Check first whether the label is defined at all, otherwise \Countercref etc. would fail!
  \zref@ifrefundefined{#1}{}{% 
    % Preexpand some information
    \edef\@tmp@a{\zref@extract{#1}{chapterinfo}}%
    \edef\@tmp@b{\zref@extract{#1}{partinfo}}%
    \edef\@tmp@c{\thechapter}%
    \edef\@tmp@d{\thepart}%
    \ifx\@tmp@a\@tmp@c\relax% Compare \thechapter with the result of the zref - label - value for chapter
    %No % at the end of the lines here!
    \Countercref{#1}
    \else
    \Countercref{#1} in \chaptername\ \zref@extract{#1}{chapterinfo}
    \ifx\@tmp@b\@tmp@d\relax% Compare \thepart with the result of the zref - label - value for part
    %
    \else
    in \partname\ \zref@extract{#1}{partinfo}% 
    \fi
    \fi
  }%
}

}
\makeatother


\usepackage{hyperref}
\usepackage{cleveref}

\renewcommand{\thepart}{\Alph{part}}


\begin{document}


\part{Alpha}
  \chapter{Beginning A}
    \section{Early Beginning A} \contextlabel{eba}
    \section{Late Beginning A}
         See \contextref{eba} then \contextref{lea}
  \chapter{End A}
  \section{Early End A}
  See \contextref{eba} then \contextref{lea}
  \section{Late End A}        \contextlabel{lea}
  \part{Beta}
  \chapter{Beginning B}
    \section{Early Beginning B}
    \section{Late Beginning B}
        See \contextref{eba} then \contextref{lea}
  \chapter{End B}
    \section{Early End B}
    \section{Late End B}
     See \contextref{eba} then \contextref{lea}
\end{document}

在此处输入图片描述

相关内容