我有一个具有如下结构的文章类文档。
- A 部分
- 第 1 部分
- 第 2 部分
- B 部分
- 第 1 部分
- 第 2 部分
我想从 B 部分的第 2 节中引用 A 部分的第 1 节。当我使用或引用另一部分中的某一节时\ref
,我得到\vref
\cref
如第 1 节所示。
由于它出现在 B 部分,读者会认为我在谈论 B 部分的第 1 节,但我的意思是 A 部分的第 1 节。
期望输出:
如 A 部分第 1 节所示。
现在到了棘手的部分。我的大部分参考资料都在同一节中。如果我在 B 部分,并且引用了 B 部分中的某些内容,我只想说
如第 1 节所示
不是
如 B 部分第 1 节所述
是否有某种组合varioref
,hyperref
以及cleveref
其他任何可以用单个命令实现的功能?(如果它是超链接并且可以包含智能页码,则可以获得加分,例如\vref
)
我认为将节号重新定义为以下形式是A.1
可行的。有没有不用这个方法的方法?
平均能量损失
\documentclass[a4paper]{article}
\usepackage[english]{babel} %do I need this? Gummi throws an error if I leave it out. I dunno.
\usepackage{varioref}
\usepackage[hidelinks]{hyperref}
\usepackage[nameinlink, capitalise, noabbrev]{cleveref}
\begin{document}
\part{First Part}\label{sec:first part}
\section{section in first part}\label{sec:in first part}
\part{Second Part}\label{sec:second part}
\section{section in second part}\label{sec:in second part}
\Cref{sec:in first part} is cool
%desired output: Section 1 in Part A is cool.
\Cref{sec:in second part} is also cool.
%desired output: Section 1 is also cool.
\end{document}
编辑:倒数第二行应该说“这部分”而不是“另一部分”。消除了参考句子的歧义。
答案1
由于没有关于标准\LaTeX
参考系统中哪个部分的部分的直接信息,这种“上下文”感知引用的解决方案涉及许多丑陋的黑客......
...如果使用标准参考系统;-)
然而,有了 Heiko Oberdiek 的zref
软件包和帮助,cleveref
这项工作可以更少的黑客攻击完成。
关键是将附加数据作为标签 - 元信息(例如计数器名称,部分值,部分值(称为属性)等)写入\zref@labelbyprops
文件并使用(幸运的是,它是可扩展的!).aux
检索相关信息\zref@extract
cleveref
这里实际上不需要这个包,但是一旦知道计数器类型,就可以很好地\crefname
使用宏等来利用其功能。\cref@<type>@name
\zclabel
请注意,需要新的宏,而不是传统的\label
宏。
\documentclass{article}
\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{sectioninfo}[-1]{\number\value{section}}
\newcommand{\zclabel}[1]{%
\zref@labelbyprops{#1}{partinfo,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{\secref}[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}{partinfo}}%
\edef\@tmp@b{\thepart}%
\ifx\@tmp@b\@tmp@a\relax% Compare \thepart with the result of the zref - label - value for par
\Countercref{#1} in this \partname%
\else
\Countercref{#1} in \partname\ \zref@extract{#1}{partinfo}%
\fi
}%
}
}
\makeatother
\usepackage{hyperref}
\usepackage{cleveref}
\renewcommand{\thepart}{\Alph{part}}
\begin{document}
\part{First Part}
\section{section in first part}\zclabel{sec:infirstpart}
\part{Second Part}
\section{section in second part}\zclabel{sec:insecondpart}
\secref{sec:infirstpart} is cool and \secref{sec:insecondpart} is cool too, but \secref{sec:inthirdpart} is even better!
\part{Third Part}
\section{section in third part}\zclabel{sec:inthirdpart}
\end{document}
答案2
如果你正在使用Overleaf
(也许它也适用于其他环境),你可以联系官方“交叉引用章节、方程式和浮点数 > 引用章节和章节”
并使用以下构造:
\section{section in first part}\label{sec:in_first_part}
Section \ref{sec:in_first_part} is cool