cleveref терпит неудачу для теоремных сред с одним счетчиком
Я хочу пронумеровать все теоремы и следствия на одном счетчике (разделе). Но когда я делаю это, умница называет их обоих "теоремой". Вот минимальный пример:
\documentclass{amsart}
\usepackage{amsthm, cleveref}
%\crefname{theorem}{theorem}{theorems}
%\crefname{corollary}{corollary}{corollaries}
\newtheorem{theorem}{Theorem}[section]
\newtheorem{corollary}[theorem]{Corollary}
\begin{document}
\section{Section title}
\begin{theorem}\label{thm:test}
Here is the theorem.
\end{theorem}
\begin{corollary}\label{cor:test}
Here is the corollary.
\end{corollary}
The theorem reference is given by \cref{thm:test} and the corollary reference is given by \cref{cor:test}.
\end{document}
Здесь следствием является "теорема 1.2". Эта проблема сохраняется даже при явном указании имени cref.
Какие-либо предложения?
4 ответа
Вам нужно загрузить либо пакет ntheorem, либо пакет amsthm, если вы хотите, чтобы cleveref различал различные среды, подобные теореме, которые используют один и тот же счетчик. Эти пакеты хранят дополнительную информацию о теоремоподобных средах, которые использует cleveref. Обратите внимание, что они должны быть загружены перед умением.
Использование ntheorem (которое долгое время было гиперреф-совместимым с помощью опции hyperref) или amsthm (также гиперреф-совместимое) вместе с cleveref - гораздо лучшее решение, чем использование необязательного аргумента для \ label. И нет необходимости возвращаться к \ трех. Если вы все равно используете ntheorem, то \cref будет делать все, что делает \thread, и многое другое (множественные ссылки, настраиваемое форматирование и т. Д.). Фактически, cleveref переопределяет \tref как псевдоним для \cref, когда ntheorem загружается с параметром tref.
(Существует хитрость - также описанная в руководстве по умному способу), которая использует пакет aliascnt для различения теоремоподобных сред без ntheorem или amsthm. Но это требует больше работы, и, честно говоря, зачем беспокоиться, когда простой \usepackage{ntheorem} или \usepackage{amsthm} отлично выполнит работу?)
Хорошо, вот обходной путь.
Укажите имя, которое будет отображаться в необязательном аргументе метки, т.е.
\begin{corollary}\label[corollary]{cor:test}
Here is the corollary.
\end{corollary}
Это дает желаемый результат, сохраняя имя среды в одном и том же месте (хотя и записывается дважды).
Я не вижу в этом ничего плохого. Я запустил ваш сценарий как с
%\crefname{theorem}{theorem}{theorems}
%\crefname{corollary}{corollary}{corollaries}
комментируется и не комментируется, и я получаю то, что ожидается
'The theorem reference is given by theorem 1.1 and the corollary reference is
given by corollary 1.2.'
Возможно, у вас есть устаревший пакет.
Также убедитесь, что вы загружаете cleveref ПОСЛЕ amsthm (и hyperref), если вы используете класс article, так как это приведет к появившейся ошибке
Поскольку вы объявили, что два вида теорем используют один и тот же счетчик, умница не сможет их различить. Попробуйте вместо этого использовать пакет ntheorem.