从 thmtools 重新定义定理列表以获取 Envname Number 而不是 Number

从 thmtools 重新定义定理列表以获取 Envname Number 而不是 Number

我正在尝试重新定义定理列表环境thmtools排版一个看起来像这样的定理列表

定义 1 Foo ......1

定理2............2

而不是通常的

1 定义 (Foo)....1

2 定理............2

我目前的尝试是这个MWE:

\documentclass{article}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{thmtools}

\declaretheorem{theorem}
\declaretheorem[sibling=theorem]{definition}

\let\oldnumberline\numberline%
\renewcommand{\numberline}[1][\negmedspace]{#1 \oldnumberline}
\makeatletter
\@for\thmt@envname:=\thmt@allenvs\do{ 
    \def\ll@envname{%
            \protect\numberline[\thmt@thmname]{\csname the\thmt@envname\endcsname}%
            \ifx\@empty\thmt@shortoptarg%
            \else
                \thmt@shortoptarg%
            \fi
        }
}
\makeatother
\begin{document}
\section{Section}
\begin{theorem}[Named Theorem]
\end{theorem}

\begin{definition}[Named Definition]
\end{definition}

\begin{definition}
\end{definition}

\listoftheorems
\end{document}

与通常的构造相比,它似乎没有任何变化。我相信问题出在循环上\@for。我想我可能运行错误,或者使用了错误的环境列表。我尝试通过查看thmtools 文档,因为我无法\ll@envname在包的代码中找到定义。这种信念是由于以下代码完全按照我的想法执行,但仅适用于环境definition(我希望有适用于所有环境的东西,而不需要每次声明新定理时都复制和粘贴代码):

\documentclass{article}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{thmtools}

\declaretheorem{theorem}
\declaretheorem[sibling=theorem]{definition}

\let\oldnumberline\numberline%
\renewcommand{\numberline}[1][\negmedspace]{#1 \oldnumberline}
\makeatletter
\def\ll@definition{%
        \protect\numberline[\thmt@thmname]{\csname the\thmt@envname\endcsname}%
        \ifx\@empty\thmt@shortoptarg%
        \else
            \thmt@shortoptarg%
        \fi
    }
\makeatother
\begin{document}
\section{Section}
\begin{theorem}[Named Theorem]
\end{theorem}

\begin{definition}[Named Definition]
\end{definition}

\begin{definition}
\end{definition}

\listoftheorems
\end{document}

我如何正确陈述\@for循环,以便代码可以推广到所有声明的定理类环境?或者,还有其他方法可以获得我想要的结果吗?

答案1

另一种方法是提供一个新\listoftheorems选项swapnumber

  • 更新 1:使布尔选项swapnumber更加强大。
  • 更新 2swapnumber与无数定理兼容。
  • 更新 3\listoftheorems:通过重新定义,删除所示的定理名称周围的括号\thmtformatoptarg
\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{xpatch}

% define new \listoftheorems option "swapnumber"
\makeatletter
\newif\ifthmt@listswap
\def\thmt@TRUE{true}
\def\thmt@FALSE{false}
\define@key{thmt-listof}{swapnumber}[true]{%
  \def\thmt@tmp{#1}%
  \ifx\thmt@tmp\thmt@TRUE
    \thmt@listswaptrue
  \else\ifx\thmt@tmp\thmt@FALSE
    \thmt@listswapfalse
  \else
    \PackageError{thmtools}{Unknown value `#1' to key swapnumber}{}%
  \fi\fi
}

% patch for unnumbered theorem
\xpatchcmd\thmt@mklistcmd
  {\protect\numberline{\protect\let\protect\autodot\protect\@empty}}
  {%
    \protect\ifthmt@listswap
    \protect\else
      \protect\numberline{\protect\let\protect\autodot\protect\@empty}%
    \protect\fi
  }
  {}{\fail}

% patch for numbered theorem
\xpatchcmd\thmt@mklistcmd
  {%
    \protect\numberline{\csname the\thmt@envname\endcsname}%
    \thmt@thmname
  }
  {%
    \protect\ifthmt@listswap
      \thmt@thmname~\csname the\thmt@envname\endcsname
    \protect\else
      \protect\numberline{\csname the\thmt@envname\endcsname}%
      \thmt@thmname
    \protect\fi
  }
  {}{\fail}
\makeatother

\declaretheorem{theorem}
\declaretheorem[sibling=theorem]{definition}
\declaretheorem[numbered=no]{axiom}

\begin{document}
\section{Section}
\begin{theorem}[Named Theorem]
\end{theorem}

\begin{definition}[Named Definition]
\end{definition}

\begin{definition}
\end{definition}

\begin{axiom}
\end{axiom}

\begin{axiom}[Named axiom]
\end{axiom}

\listoftheorems

\renewcommand\thmtformatoptarg[1]{ #1}
\listoftheorems[
  swapnumber, 
  title={List of Theorems (option \texttt{swapnumber} applied and parentheses removed)}
]
\end{document}

在此处输入图片描述

答案2

这个问题其实很愚蠢。我试图重新定义\ll@envname,但这不是我想要重新定义的命令。实际上,我想重新定义\csname ll@\thmt@envname \endcsname(我在阅读文档中可用的 ' 代码的第 800 行时意识到了这一点thmtools)。解决方案非常简单:只需更正我正在重新定义的命令的名称,并进行适当的修改\expandafter(将其缩短为\@xathmtools,依此类推。

\documentclass{article}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{thmtools}

\declaretheorem{theorem}
\declaretheorem[sibling=theorem]{definition}

\let\oldnumberline\numberline%
\renewcommand{\numberline}[1][\negmedspace]{#1 \oldnumberline}
\makeatletter
\@for\thmt@envname:=\thmt@allenvs\do{ 
    \@xa\def\csname ll@\thmt@envname\endcsname{%
            \protect\numberline[\thmt@thmname]{\csname the\thmt@envname\endcsname}%
            \ifx\@empty\thmt@shortoptarg%
            \else
                \thmt@shortoptarg%
            \fi
        }
}
\makeatother
\begin{document}
\section{Section}
\begin{theorem}[Named Theorem]
\end{theorem}

\begin{definition}[Named Definition]
\end{definition}

\begin{definition}
\end{definition}

\listoftheorems
\end{document}

相关内容