`\autoref` に環境名を番号なしで表示するように要求する

`\autoref` に環境名を番号なしで表示するように要求する

私は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}

<code>cleveref</code> と <code>memoir</code>

答え2

以下の用途zref代わりにcleveref新しいものを作る財産envname(モジュールによって提供されるものと同様のzref-env)と呼ばれ、\<env>autorefnameまたは\@currenvirエントリ名を格納します。currenvir

ここに画像の説明を入力してください

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

関連情報