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.

Другие вопросы по тегам