(关于可变章节参考,按照@werner 的建议)
这是介于评论请求和实际问题之间的(也是我尝试根据个人喜好实现链接问题的想法时的经验总结,我希望其他人也觉得它有用)。
这个想法(与varioref
包裹) 以避免在(超)引用时出现冗余和尴尬。
因此,假设你在第 5 章中对第 4 章有一个(超)引用,我希望它以(链接)的形式出现“下一章”而不是“第 5 章第 XX 页”(斜体表示强调),类似地,如果您在第 4 章中引用第 3 章。
同样,我希望该机制能够适用于章节、小节等直至小段落。
初步解决方案
问题的初步(即\chapter
仅考虑 s )解决方案已发布在上面链接的问题中,基本上可以归结为:
\usepackage{hyperref}
\usepackage{smartref}
\usepackage{cleveref}
\usepackage{xifthen}
\newcounter{actualchap}
\addtoreflist{chapter}
\newcommand{\relref}[1]{
\sgetchapterval{\targetchap}{#1}% Retrieve chapter counter from reference
\setcounter{actualchap}{\value{chapter}}
\addtocounter{actualchap}{1}% Next chapter
\ifthenelse{\equal{\targetchap}{\theactualchap}}%
{\hyperref[#1]{the next chapter}}%
{\addtocounter{actualchap}{-2}% Previous chapter
\ifthenelse{\equal{\targetchap}{\theactualchap}}%
{\hyperref[#1]{the previous chapter}}%
{\cref{#1}}%
}%
}
\crefformat{chapter}{#2chapter~#1#3}
\Crefformat{chapter}{#2Chapter~#1#3}
请注意,我们使用hyperref
包裹, 这smartref
包裹, 这cleveref
包裹,以及xifthen
包裹。
题外话/解释
为什么我们需要两个都 smartref
和cleveref
?好吧,因为我们想获得所有这些不错的功能,而不牺牲(超)引用自定义。我能想到的所有其他解决方案最终都(直接或间接地)做了类似的事情:
\renewcommand*{\thechapter}{WHATEVER}
现在,这打破了我们精心制定的所有smartref
咒语:smartref
依赖于.aux
包含未受污染的LaTeX 引用,而重新定义\thechapter
可以使所述条目本身包含 LaTeX 命令(尝试使用章节编号\oldstylenums
肯定会陷入这种情况),换句话说:格式化发生得太快了!(它已经存在于.aux
文件中了)
另一方面,如果我们cleveref
专门使用(通过使用 的cleveref
命令\cref
而不是 LaTeX 的命令\ref
),我们可以实现相同的效果(请参阅上面的\crefformat
和\Crefformat
命令,请参阅cleveref
的文档以了解#2
和#3
参数是什么以及为什么我们需要定义每个参数的大写和非大写版本的解释)没有破坏我们的其他工作:cleveref
保留 latex 的引用,并且它仅在最后应用格式化!(第二次运行 LaTeX)
问题正确
所以,这非常棒,但仍然有改进的空间(除了一些调试和.aux
文件挖掘之外,我的技术技能几乎不存在):
我希望同样的机制能够作用于章节、小节等(如上所述)没有必须定义不同的命令(即
\relref
上述命令应该能够自行辨别它给出的引用是章节、节、小节等),*
它也应该适用于ed 分段命令,在完成所有这些操作的同时它应该能够很好地运行
hyperref
(我认为没有理由不能这样做)。
所以……问题确实比较长,不过还是想分享一下积累的经验。
我激起你的兴趣了吗?:)
答案1
关于你的第一个问题,我认为你应该能够使用\getreftype{..}
命令如这里所定义(\getreftype{#1}
在您的情况下)辨别作为函数参数的引用的类型。
我认为类似的事情应该有效:
\newcounter{actualelement}
\addtoreflist{chapter}
\addtoreflist{section}
\addtoreflist{subsection}
% ... and more
\newcommand{\relref}[1]{
\csname sget\getreftype{#1}val\endcsname{\target}{#1}% Retrieve 'target' counter from reference
\setcounter{actualelement}{\value{\getreftype{#1}}}% Current 'element'
\addtocounter{actualelement}{1}% Next 'element'
\ifthenelse{\equal{\target}{\theactualelement}}%
{\hyperref[#1]{the next \getreftype{#1}}}%
{%
\addtocounter{actualelement}{-2}% Previous 'element'
\ifthenelse{\equal{\target}{\theactualelement}}%
{\hyperref[#1]{the previous \getreftype{#1}}}%
{\cref{#1}}%
}%
}
\crefformat{chapter}{#2chapter~#1#3}
\Crefformat{chapter}{#2Chapter~#1#3}
\crefformat{section}{#2section~#1#3}
\Crefformat{section}{#2Section~#1#3}
\crefformat{subsection}{#2subsection~#1#3}
\Crefformat{subsection}{#2Subsection~#1#3}
但目前还不知道第 2 点和第 3 点......
答案2
我知道这是一个非常这是一个老问题,但我正在筛选一些已知的交叉引用问题,刚刚发现了它,我(披露)最近想出了一个包,它可以满足您的要求,而且实际上更通用,因为您可以对页面进行相同类型的相对引用,等等。它被称为zref-check
并基于zref
(因此它使用 zref 标签,而不是标准标签,尽管您可以让它们在某种程度上一起工作,请查看文档)。
而且它确实满足了您的所有要求。特别是,它适用于所有部分和章节,无论是否带星号,并且hyperref
如果您加载它就会使用(这是可配置的)。
UI 概念与常规参考命令(标准或最常见包)略有不同:您无需尝试猜测应该排版什么,而是zref-check
可以编写您想要的内容,并且如果您所做的语句不再对应于排版的实际文档,则可以轻松地在编译时获取警告。
使用分段标签引用的示例文档:
\documentclass{book}
\usepackage{lipsum}
\usepackage{zref-check}
\usepackage{hyperref}
\begin{document}
\chapter{Chapter 1}
\zlabel{cha:chapter-1}
\lipsum
\zcheck[nextchap]{sec:section-2.1}{on the next chapter}
\zcheck[nextsec]{sec:section-1.1}{on the next section}
\section{Section 1.1}
\zlabel{sec:section-1.1}
\lipsum
\chapter{Chapter 2}
\zlabel{cha:chapter-2}
\lipsum
\section{Section 2.1}
\zlabel{sec:section-2.1}
\lipsum
\zcheck[nextsec]{sec:section-2.2}{on the next section}
\section{Section 2.2}
\zlabel{sec:section-2.2}
\lipsum
As discussed \zcheck[prevsec]{sec:section-2.1}{on the previous section}:
\lipsum[1]
But more of this \zcheck[nextchap]{cha:chapter-1}{on the next chapter} (this
is an incorrect reference, so you get a warning).
\end{document}
还有更多(总共有 22 个定义的“检查”可用),但这只是利用 OP 所需的那种分段关系。