考虑这个基本文件
\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}