我的目标与这个问题但是,我想使用包\newtcbtheorem
来实现同样的效果tcolorbox
。例如
\documentclass{article}
\usepackage{nameref}
\usepackage{tcolorbox}
\tcbuselibrary{theorems}
\newtcbtheorem{thm}{Theorem}{}{thm}
\begin{document}
\begin{thm}{My awesome theorem}{awesome}
Isn't this theorem so awesome?
\end{thm}
This is a reference to \nameref{thm:awesome}.
\end{document}
应该打印“这是对我的令人敬畏的定理的引用。”。
\newtcbtheorem
不幸的是,如果我使用而不是 ,链接问题的答案将不再有效\newtheorem
。有没有办法修改该答案以使其在这种情况下有效?
\begin{thm}\end{thm}
(请注意,由于这里未提及的原因,将通过调用创建的包装\newtheorem
在 a 中\tcbenvironment
不是一个选项。)
答案1
原因是\@currentlabelname
没有定义,它被写入了.aux
bynameref
的版本\label
。
解决这个问题最简单的方法是打补丁或稍微重新定义,用设置\@currentlabelname
,{##2}
稍后会扩展以包含定理名称。(补丁也可以!)
\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{theorems}
\makeatletter
\renewcommand{\new@tcbtheorem}[5][]{%
\@@newtcolorbox[auto counter,#1]{#2}[3][]{#4,%
title={\tcb@theo@title{#3}{\thetcbcounter}{##2}},%
list entry={\protect\numberline{\thetcbcounter}##2},%
code={\gdef\@currentlabelname{##2}\tcb@theo@label{#5}{##3}},%
##1}%
\@@newtcolorbox[#1,no counter,list inside=]{#2*}[2][]{#4,%
title={\tcb@theo@title{#3}{\@empty}{##2}},%
##1}%
}
\makeatother
\usepackage{nameref}
\usepackage{hyperref}
\newtcbtheorem{thm}{Theorem}{}{thm}
\begin{document}
This is a reference to \nameref{thm:awesome} and \ref{thm:awesome}%
\clearpage
\begin{thm}{My awesome theorem}{awesome}
Isn't this theorem so awesome?
\end{thm}
\end{document}
答案2
感谢 Christian Hupfer 在他的回答中解决了这些请求。
我可以添加一个更短的方法来实现基督徒的解决方案:
\documentclass{article}
\usepackage{nameref}
\usepackage{hyperref}
\usepackage{tcolorbox}
\tcbuselibrary{theorems}
\makeatletter
\newtcbtheorem{thm}{Theorem}{code={\edef\@currentlabelname{#2}}}{thm}
%\newtcbtheorem{thm}{Theorem}{code={\NR@gettitle{#2}}}{thm} % alternatively, if nameref is loaded
\makeatother
\begin{document}
This is a reference to \nameref{thm:awesome} and \ref{thm:awesome}%
\clearpage
\begin{thm}{My awesome test theorem}{awesome}
Isn't this theorem so awesome?
\end{thm}
\end{document}