我注意到,包含章节编号的带有自动计数器的“tcolorbox”会在日志文件中引发警告,并且相应的超链接仅指向第一次出现的情况。
梅威瑟:
\documentclass{scrartcl}
\usepackage{tcolorbox}
\newtcolorbox[auto counter,number within=section]{mybox}[1][]{title=MyBox~\thetcbcounter,#1}
\usepackage{hyperref}
\begin{document}
Mybox~\ref{mybox1}; Mybox~\ref{mybox2}
\clearpage
\section{Section}
\begin{mybox}[label=mybox1]
The counter name is \texttt{\tcbcounter}.
\end{mybox}
\clearpage
\section{Section}
\begin{mybox}[label=mybox2]
The counter name is \texttt{\tcbcounter}.
\end{mybox}
\end{document}
日志文件中的警告内容如下
warning (pdf backend): ignoring duplicate destination with the name 'tcb@[email protected]'
因此,不知何故“tcbcounter”针对第二部分正确重置,但内部计数器“tcb@cnt@mybox”不包含部分编号,因此第二个框的引用链接指向第一个。
这是已知的还是可能是错误?或者我作为用户可以轻松修复此问题?谢谢!
答案1
hyperref
有一个内置机制。如果为计数器\theH<counter>
定义了命令,则它用于内部锚点名称,而不是\the<counter>
。
\documentclass{scrartcl}
\usepackage{tcolorbox}
\usepackage{hyperref}
\newtcolorbox[auto counter,number within=section]{mybox}[1][]{%
title=MyBox~\thetcbcounter,
#1
}
\providecommand{\theHtcbcounter}{\thesection.\arabic{tcbcounter}}
\begin{document}
Mybox~\ref{mybox1}; Mybox~\ref{mybox2}
\clearpage
\section{Section}
\begin{mybox}[label=mybox1]
The counter name is \texttt{\tcbcounter}.
\end{mybox}
\clearpage
\section{Section}
\begin{mybox}[label=mybox2]
The counter name is \texttt{\tcbcounter}.
\end{mybox}
\end{document}
这样,两个链接就会有不同的锚点名称,一切就都好了。
如果您希望它在稍后的加载中起作用hyperref
,您必须深入内部操作:
\makeatletter
\providecommand\theHtcb@cnt@mybox{\thesection.\arabic{tcb@cnt@mybox}}
\makeatother
因为tcolorbox
它与颜色框相联系。
答案2
根据@egreg的回答,似乎只需要tcolorbox
在加载包之后定义新的es hyperref
。如果两者都应该从自定义包内部或更复杂的前导结构中完成,则可以使用包中的\AtEndPreamble
和。\AtBeginDocument
etoolbox
尽早加载包auxhook
可以避免使用类时出现错误消息koma-scrip
(请参阅etoolbox + koma-script:警告“似乎有人破坏了 auxhook 包”)。
因此,功能性的 MWE 将是:
\documentclass{scrartcl}
\usepackage{tcolorbox}
\usepackage{etoolbox, auxhook}
\AtEndPreamble{
\usepackage{hyperref}
}
\AtBeginDocument{
\newtcolorbox[auto counter,number within=section]{mybox}[1][]{%
title=MyBox~\thetcbcounter,#1}
}
\begin{document}
Mybox~\ref{mybox1}; Mybox~\ref{mybox2}
\clearpage
\section{Section}
\begin{mybox}[label=mybox1]
The counter name is \texttt{\tcbcounter}.
\end{mybox}
\clearpage
\section{Section}
\begin{mybox}[label=mybox2]
The counter name is \texttt{\tcbcounter}.
\end{mybox}
\end{document}