tcolorbox:超链接标签重复的潜在错误

tcolorbox:超链接标签重复的潜在错误

我注意到,包含章节编号的带有自动计数器的“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和。\AtBeginDocumentetoolbox

尽早加载包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}

相关内容