在标记定理等时,标签通常采用这种形式:
\label{th:pyth}
因此,当提到定理时,我们经常写道:
According to theorem \ref{th:pyth} ...
但是“theorem”和“th”有点冗余,所以我想创建一个看起来像的命令\refenv{th}{pyth}
,它会输出theorem 1
。为了做到这一点,我需要将第一个参数与字符串匹配,所以我尝试使用boolexpr
包:
\usepackage{boolexpr}
\NewDocumentCommand{\refenv}{mm}{
\switch
\case{#1 = th} theorem
\case{#1 = prop} proposition
\case{#1 = coro} corollary
\case{#1 = lem} lemma
\case{#1 = prf} proof
\case{#1 = def} definition
\case{#1 = rem} remark
\case{#1 = eq} equation
\endswitch
\ref{#1:#2}
}
没有成功,因为该boolexpr
包只比较数字。如何找到不需要多个嵌套ifthenelse
命令的等效方法?
答案1
您可以使用更灵活的大小写切换功能。
\documentclass{article}
\usepackage{amsthm}
\ExplSyntaxOn
\NewDocumentCommand{\refenv}{mm}
{
\str_case:nnF { #1 }
{
{th}{theorem}
{prop}{proposition}
{coro}{corollary}
{lem}{lemma}
{prf}{proof}
{def}{definition}
{rem}{remark}
{eq}{equation}
}
{??}
\nobreakspace\ref{#1:#2}
}
\ExplSyntaxOff
% just a couple of envs
\newtheorem{theorem}{Theorem}
\theoremstyle{definition}
\newtheorem{definition}{Definition}
\begin{document}
\begin{definition}\label{def:important}
A \emph{definition} defines.
\end{definition}
\begin{theorem}\label{th:main}
The main theorem.
\end{theorem}
\begin{equation}\label{eq:best}
0=0
\end{equation}
We see that \refenv{th}{main} depends on \refenv{def}{important}
and \refenv{eq}{best}.
\end{document}
但最好使用cleveref
。
\documentclass{article}
\usepackage{amsthm}
\usepackage{cleveref}
% just a couple of envs
\newtheorem{theorem}{Theorem}
\theoremstyle{definition}
\newtheorem{definition}{Definition}
\begin{document}
\begin{definition}\label{def:important}
A \emph{definition} defines.
\end{definition}
\begin{theorem}\label{th:main}
The main theorem.
\end{theorem}
\begin{equation}\label{eq:best}
0=0
\end{equation}
We see that \cref{th:main} depends on \cref{def:important}
and \cref{eq:best}.
\end{document}
请参阅手册以cleveref
了解如何自定义参考。
答案2
egreg 建议的包cleveref
满足了我的所有需求,并且消除了冗余,因此不需要再进行其他操作。