当我尝试cleveref
与SIAM 样式文件,对定理、章节、图表的引用是准确的,但所有其他参考文献的名称(推论、定义、引理……)都替换为“定理”。这是一个最小的例子:
\documentclass[final]{siamltex}
\usepackage{cleveref}
\begin{document}
Here's a definition.
\begin{definition}
\label{def:somedef} Some definition.
\end{definition}
If I use cleveref to try to refer to the above, I get ``\Cref{def:somedef}''.
\end{document}
生成结果:
Here’s a definition.
Definition 0.1. Some definition.
If I use cleveref to try to refer to the above, I get “Theorem 0.1”.
类似的问题是问不久前,答案是依靠ntheorem
或。我想我可以通过重新定义所有有问题的环境(等等)amsthm
来解决这个问题,但是有没有更简单或更干净的方法呢?mydefinition
mylemma
答案1
当多个环境共享相同的计数器时 - 例如siamltex
文档类中的定理、引理、推论、命题和定义的情况 -cleveref
需要一些帮助才能确定哪一个可能的环境实际上正在用于给定的标签。
我认为,解决您的问题最简单的方法是明确加载包ntheorem
,然后重新运行siamltex
其五个定理类环境的所有定义。(当然,如果您不需要在论文中使用所有五个环境,则可以跳过重新定义那些您不使用的环境。)
以下是使用此方法的 MWE 的修改形式。
\documentclass[final]{siamltex}
\usepackage{ntheorem,cleveref}
\makeatletter
% The next few lines are from 'siamltex.cls', but now with
% \renewtheorem{...} instead of \newtheorem{...}
\if@onethmnum
\renewtheorem{theorem}{Theorem}
\renewtheorem{lemma}[theorem]{Lemma}
\renewtheorem{corollary}[theorem]{Corollary}
\renewtheorem{proposition}[theorem]{Proposition}
\renewtheorem{definition}[theorem]{Definition}
\else
\renewtheorem{theorem}{Theorem}[section]
\renewtheorem{lemma}[theorem]{Lemma}
\renewtheorem{corollary}[theorem]{Corollary}
\renewtheorem{proposition}[theorem]{Proposition}
\renewtheorem{definition}[theorem]{Definition}
\fi
\makeatother
\begin{document}
\section{In the beginning}
Here's a definition.
\begin{definition}
\label{def:somedef} Some definition.
\end{definition}
If I use \textbf{cleveref} to try to refer to the above, I now get ``\cref{def:somedef}''.
\end{document}
附录正如 Ahmed Musa 在他的回答中指出的那样,我从文件中复制的代码siamltex.cls
(夹在\makeatletter
和\makeatother
指令之间的代码)似乎不必要地复杂。为了cleveref
识别基本theorem
环境的变体,实际上只需要以下四个指令:
\renewtheorem{lemma}[theorem]{Lemma}
\renewtheorem{corollary}[theorem]{Corollary}
\renewtheorem{proposition}[theorem]{Proposition}
\renewtheorem{definition}[theorem]{Definition}
答案2
我不知道是谁制作了 siamltex 类文件,但我对 Mico 代码中的条件感到好奇。我必须找到 siamltex.cls(它不在 MiKTeX 或 TeXLive 中),在那里我看到了原始定义。我不知道为什么那里的条件看起来不寻常。请问为什么不是下面这样?跟踪文件有 20 英里长;我可能会在这里节省一些时间。下面给了我 Mico 报告的确切输出。事实上,我尝试了其他方法,没有任何意外。
\makeatletter
\if@onethmnum
\renewtheorem{theorem}{Theorem}
\else
\renewtheorem{theorem}{Theorem}[section]
\fi
\makeatother
\renewtheorem{lemma}[theorem]{Lemma}
\renewtheorem{corollary}[theorem]{Corollary}
\renewtheorem{proposition}[theorem]{Proposition}
\renewtheorem{definition}[theorem]{Definition}