cleveref терпит неудачу для теоремных сред, использующих один и тот же счетчик - PullRequest
6 голосов
/ 28 июня 2011

Я хочу пронумеровать все теоремы и следствия на одном счетчике (разделе).Но когда я делаю это, умница называет их обоих «теорема».Вот минимальный пример:

\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 ]

3 голосов
/ 04 января 2012

Вам необходимо загрузить либо пакет ntheorem, либо пакет amsthm, если вы хотите, чтобы cleveref различал различные среды, подобные теореме, в которых используется один и тот же счетчик. Эти пакеты хранят дополнительную информацию о теоремоподобных средах, которые использует cleveref. Обратите внимание, что они должны быть загружены до cleveref.

Использование ntheorem (которое долгое время было гиперреф-совместимым с помощью опции hyperref) или amsthm (также гиперреф-совместимым) вместе с cleveref - гораздо лучшее решение, чем использование необязательного аргумента для \ label. И нет необходимости возвращаться к \ трех. Если вы все равно используете ntheorem, то \ cref будет делать все, что делает \ thread, и многое другое (множественные ссылки, настраиваемое форматирование и т. Д.). Фактически, cleveref переопределяет \ tref как псевдоним для \ cref, когда ntheorem загружается с параметром tref.

(Существует хитрость - также описанная в умном руководстве), которая использует пакет aliascnt для различения теоремоподобных сред без ntheorem или amsthm. Но это требует больше работы и, честно говоря, зачем беспокоиться, когда простой \ usepackage {ntheorem} или \ usepackage {amsthm} отлично выполнит эту работу?)

2 голосов
/ 06 августа 2011

Хорошо, вот обходной путь.

Укажите имя, которое будет отображаться в необязательном аргументе метки, например:

\begin{corollary}\label[corollary]{cor:test}
Here is the corollary.
\end{corollary}

Это дает желаемый вывод при сохранении имени среды вто же место (хотя и написано дважды).

1 голос
/ 20 июля 2011

Я не вижу в этом ничего плохого. Я запустил ваш скрипт как с

%\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, так как это вызовет ошибку, которую вы видели

0 голосов
/ 30 июня 2011

Поскольку вы объявили, что два вида теорем используют один и тот же счетчик, умница не сможет их различить. Попробуйте вместо этого использовать пакет ntheorem.

...