如何引用其他部分中提及该部分的章节?

如何引用其他部分中提及该部分的章节?

我有一个具有如下结构的文章类文档。

  • 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 节所述

是否有某种组合variorefhyperref以及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

在此处输入图片描述

相关内容