我正在尝试定义一个变体,\ref
它只挑选出定理列表项中的项目编号没有前一个定理数。例如:
定理 1.1。
(一)重要的事情。
(ii)与(i)相关的一些重要的事情。
然而,我能做的只有以下几点:
定理 1.1。
(一)重要的事情。
(ii) 提及 1.1(i) 的重要事项。
请注意,我仍然希望能够打印计数器 1.1(i),因为我可能希望稍后在文档中使用它。也就是说,除了能够分别使用命令和打印 1.1(i) 和定理 1.1(i) 之外\ref{theoremlabel}
,\Cref{theoremlabel}
我还想要一个只打印 (i) 的新命令\itemref{itemlabel}
。我希望这三个命令也都可以点击(使用包hyperref
)。
请注意,这与问题非常相似仅参考小节编号我已经尝试适应那里给出的解决方案马可·丹尼尔但遗憾的是我的 TeX 编码技能不足。
这是我的 MWE:
\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{enumitem}
\newlist{thmlist}{enumerate}{1}
\setlist[thmlist]{label=(\roman{thmlisti}), ref=\thethm(\roman{thmlisti})}
\usepackage{hyperref}
\usepackage[nameinlink]{cleveref}
\theoremstyle{plain}
\newtheorem{thm}{Theorem}[section]
\Crefname{thm}{Theorem}{Theorems}
\addtotheorempostheadhook[thm]{\crefalias{thmlisti}{thm}}
\begin{document}
\section{A theorem}
\begin{thm}\label{theoremlabel}~
\begin{thmlist}
\item\label{itemlabel} Something important.
\item Something important about \ref{itemlabel}. [Here's where I'd like to use my proposed \verb+\itemref{itemlabel}+ command.]
\end{thmlist}
\end{thm}
Later on in my document... Isn't \Cref{theoremlabel} interesting? I particularly like its clickable counter \ref{theoremlabel}.
\end{document}
注意:使用该命令的巧妙\addtotheorempostheadhook
之处在于T·弗伦在问题中引用 Theorem 环境中标签类型为“Theorem”的列表项。
提前谢谢了!
答案1
您可以使用该\p@<counter>
功能:当计数器表示时,它前面是扩展\p@<counter>
(通常为空),我们可以将其用于我们的目的,即插入其中\thethm
,但作为另一个命令的参数,我们可以在使用时重新定义。
\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{enumitem}
\newlist{thmlist}{enumerate}{1}
\setlist[thmlist]{label=(\roman{thmlisti})}
\makeatletter
\renewcommand{\p@thmlisti}{\perh@ps{\thethm}}
% the same \DeclareRobustCommand{\perh@ps}[1]{#1}, but more efficient
\protected\def\perh@ps#1{#1}
\newcommand{\itemref}[1]{%
\begingroup % locally disable \perh@ps
\let\perh@ps\@gobble\ref{#1}%
\endgroup
}
\makeatother
\usepackage{hyperref}
\usepackage[nameinlink]{cleveref}
\theoremstyle{plain}
\newtheorem{thm}{Theorem}[section]
\Crefname{thm}{Theorem}{Theorems}
\addtotheorempostheadhook[thm]{\crefalias{thmlisti}{thm}}
\begin{document}
\section{A theorem}
\begin{thm}\label{theoremlabel}\mbox{}
\begin{thmlist}
\item\label{itemlabel} Something important.
\item Something important about \itemref{itemlabel}.
\end{thmlist}
\end{thm}
Later on in my document... Isn't \Cref{theoremlabel} interesting?
I particularly like its clickable counter \ref{theoremlabel}
and \ref{itemlabel}.
\end{document}
替代解决方案,满足 Barbara Beeton 和我的口味,带有直立的项目标记:
\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{enumitem}
\newlist{thmlist}{enumerate}{1}
\setlist[thmlist]{label=\textup{(\roman{thmlisti})},ref={(\roman{thmlisti})}}
\makeatletter
\renewcommand{\p@thmlisti}{\perh@ps{\thethm}}
\protected\def\perh@ps#1#2{\textup{#1#2}}
\newcommand{\itemrefperh@ps}[2]{\textup{#2}}
\newcommand{\itemref}[1]{\begingroup\let\perh@ps\itemrefperh@ps\ref{#1}\endgroup}
\makeatother
\usepackage{hyperref}
\usepackage[nameinlink]{cleveref}
\theoremstyle{plain}
\newtheorem{thm}{Theorem}[section]
\Crefname{thm}{Theorem}{Theorems}
\addtotheorempostheadhook[thm]{\crefalias{thmlisti}{thm}}
\begin{document}
\section{A theorem}
\begin{thm}\label{theoremlabel}\mbox{}
\begin{thmlist}
\item\label{itemlabel} Something important.
\item Something important about \itemref{itemlabel}.
\end{thmlist}
\end{thm}
Later on in my document... Isn't \Cref{theoremlabel} interesting?
I particularly like its clickable counter \ref{theoremlabel}
and \ref{itemlabel}.
\end{document}
答案2
重新定义了一些内容,超链接起作用了,基本上我重新发明了 John Kormylo 的做法(也请在那里赞同他的回答!): 如何根据 \ref 相对于 \label 的调用位置来更改其外观
\itemref
我使用\getrefnumber
from包定义了请求的refcount
。例如,\StrBetween
可以使用括号之间的项目标签进行搜索: 。(i)
\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{xstring}
\usepackage{refcount}
\usepackage{enumitem}
\usepackage{hyperref}
\usepackage[nameinlink]{cleveref}
\theoremstyle{plain}
\newtheorem{thm}{Theorem}[section]
\Crefname{thm}{Theorem}{Theorems}
\newlist{thmlist}{enumerate}{1}
\setlist[thmlist]{label={\textup{(\roman{thmlisti})}}, ref={\textup{\thethm(\roman{thmlisti})}}}
\providecommand{\itemreffont}[1]{\textup{#1}}
\addtotheorempostheadhook[thm]{\crefalias{thmlisti}{thm}}
\makeatletter
\newcommand{\itemref}[1]{%
\begingroup
\@ifundefined{r@#1}{\refused{#1}}{%
\edef\tempx{\detokenize\getrefnumber{#1}}% Fetch the literal reference 1.1(i) (here)
\StrBetween{\tempx}{(}{)}[\@itemref]% Get what's between the parantheses
\edef\restore@@@@link{\getrefbykeydefault{#1}{anchor}{}}%
\hyperlink{\restore@@@@link}{\itemreffont{(\@itemref)}}% Display the reference
}%
\endgroup
}
\makeatother
\usepackage{blindtext}
\begin{document}
\blindtext[10]
\section{A theorem}
\begin{thm}\label{theoremlabel}~
\begin{thmlist}
\item\label{itemlabel} Something important.
\item Something important about \itemref{itemlabel}. [Here's where I'd like to use my proposed \verb+\itemref{itemlabel}+ command.]
\end{thmlist}
\end{thm}
Later on in my document... Isn't \Cref{theoremlabel} interesting? I particularly like its clickable counter \ref{theoremlabel}.
\newpage
Test for the hyperlink: \itemref{itemlabel}
\end{document}