如何使用cleveref
包在部分页面范围内创建链接?现在我使用下一个代码
\section{Referenced}
\label{sec:ref-start}
...
\label{sec:ref-end}
然后使用页面范围的引用
\cpagerefrange{sec:ref-start}{sec:ref-end}
我怎么能写出类似的东西
\refsectionpagerange{sec:ref-start}
自动确定章节的结尾?这在 LaTeX 中是好的做法吗?
这个问题参考页面范围->我可以避免使用 2 个标签吗?用两个标签标记一段文本,但我想使用一个命令来自动标记该部分。
答案1
一个解决方案zref
(虽然不是特别需要,但它是一个非常方便和强大的包),每个实体使用一个标签,即section
等等。
\RegisterPostLabelHook
包中的宏添加xassoccnt
了在 之后执行的“另一个”标记命令\label
,如下所示zlabel
。这种方法的缺点是,任何\label
调用都会在.aux
文件中生成两个标签条目,而不是一个。如果不希望出现这种情况,请将所有\label
出现的内容重命名为\zlabel
并注释掉\RegisterPostLabelHook
。
标签信息评估于\refsectionpageref
并相应显示。
该宏还会检查两个标签是否出现在同一页面上,但无论标签是否已定义或指向后一个实体的标签是否用作第一个参数,它都不会发出任何警告,也不会检查所使用的标签是否与section
这里的计数器绑定,因此不幸的是,属于不同计数器的标签可能会混合在一起。
\refsectionpageref
如果希望使用此功能,则 带星号的版本会抑制超链接。
\documentclass{article}
\usepackage{blindtext}
\usepackage[user,hyperref,counter]{zref}
\usepackage{xassoccnt}
\usepackage{hyperref}
\makeatletter
\providecommand{\hyperlink}[2]{}
\NewDocumentCommand{\extractsectionlabel}{sm}{%
\zref@ifrefundefined{#2}{}{%
\IfBooleanTF{#1}{%
\zref@extract{#2}{page}%
}{%
\hyperlink{\zref@extract{#2}{anchor}}{\zref@extract{#2}{page}}%
}%
}%
}
\NewDocumentCommand{\refsectionpagerange}{smm}{%
\IfBooleanTF{#1}{%
\ifnum0=\pdfstrcmp{\zref@extract{#2}{page}}{\zref@extract{#3}{page}}%
\extractsectionlabel*{#2}%
\else
\extractsectionlabel*{#2} -- \extractsectionlabel*{#3}%
\fi
}{%
\ifnum0=\pdfstrcmp{\zref@extract{#2}{page}}{\zref@extract{#3}{page}}%
\extractsectionlabel{#2}%
\else
\extractsectionlabel{#2} -- \extractsectionlabel{#3}%
\fi
}%
}
\makeatother
\RegisterPostLabelHook{\zlabel}
\begin{document}
See \refsectionpagerange{foo}{fooend}
\section{Foo} \label{foo}
\section{Foobar} \label{foobar}
\blindtext[10]
\clearpage
\section{Fooend} \label{fooend}
\clearpage
\end{document}