
Я использую memoir
класс и определяю теоремы с помощью thmtools
. Теоремы часто имеют имя, помимо нумерации. Я хочу написать \fullref
команду, которая выводит имя среды (здесь, Theorem
) вместе с ее именем, но без ее номера. (Эта команда должна работать для любой среды, для которой определено имя, например, через \myenvautorefname
.)
Раньше я использовал следующую команду, которую можно найти здесь, на TeX SE:
\newcommand{\fullref}[1]{\hyperref[#1]{\namecref{#1}\ \nameref*{#1}}}
К сожалению, memoir
и cleveref
конфликтуют друг с другом. Поэтому я бы хотел обойтись без cleveref
.
Кажется, я смогу добиться того же эффекта, используя autoref
только. Команда
\newcommand{\fullref}[1]{\hyperref[#1]{\autoref*{#1}\ \nameref*{#1}}}
почтиделает то, что мне нужно, за исключением того, что отображает номер теоремы между Theorem
и названием теоремы.
Вот MWE, иллюстрирующий приведенную выше команду:
\documentclass{memoir}
\usepackage{amsthm,thmtools}
\usepackage{nameref}
\usepackage{hyperref}
\declaretheorem{theorem}
\renewcommand{\theoremautorefname}{Theorem}
\newcommand{\fullref}[1]{\hyperref[#1]{\autoref*{#1}\ \nameref*{#1}}}
\begin{document}
\begin{theorem}[Whatever]
\label{thm:whatever}
Some witty theorem.
\end{theorem}
% The following outputs "Theorem 1 Whatever".
% I would like "Theorem Whatever".
Consider \fullref{thm:whatever}.
\end{document}
Заранее спасибо!
решение1
Почему бы не использовать cleveref
?!
\documentclass{memoir}
\usepackage{amsthm,thmtools}
\usepackage{nameref}
\usepackage{hyperref}
\usepackage{cleveref}
\declaretheorem{theorem}
\renewcommand{\theoremautorefname}{Theorem}
\newcommand{\fullref}[1]{\hyperref[#1]{\namecref{#1}\ \nameref*{#1}}}
\begin{document}
\begin{theorem}[Whatever]
\label{thm:whatever}
Some witty theorem.
\end{theorem}
% The following outputs "Theorem 1 Whatever".
% I would like "Theorem Whatever".
Consider \fullref{thm:whatever}.
\end{document}
решение2
Следующие примененияzref
как альтернативаcleveref
чтобы создать новыйсвойствоназывается envname
(аналогично тому, что предоставляется модулем zref-env
), который хранит либо \<env>autorefname
или \@currenvir
- имя curr
объекта envir
:
\documentclass{memoir}
\usepackage{amsthm,thmtools,zref}
\usepackage{hyperref}% Loads nameref
\makeatletter
\zref@newprop{envname}[??]{%
\expandafter\ifx\csname\@currenvir autorefname\endcsname\relax
\@currenvir
\else
\csname \@currenvir autorefname\endcsname
\fi}%
\AtBeginDocument{
\let\oldlabel\label
\renewcommand{\label}[1]{\zref@labelbyprops{#1}{envname}\oldlabel{#1}}
}
\newcommand{\fullref}[1]{%
\zref@refused{#1}% Mark label as used
\hyperref[#1]{\zref@extract{#1}{envname}\ \nameref*{#1}}}
\makeatother
\declaretheorem{theorem}
\renewcommand{\theoremautorefname}{Theorem}
\begin{document}
\begin{theorem}[Whatever]
\label{thm:whatever}
Some witty theorem.
\end{theorem}
% The following outputs "Theorem Whatever".
Consider \fullref{thm:whatever}.
\end{document}