![从 thmtools 重新定义定理列表以获取 Envname Number 而不是 Number](https://linux22.com/image/418384/%E4%BB%8E%20thmtools%20%E9%87%8D%E6%96%B0%E5%AE%9A%E4%B9%89%E5%AE%9A%E7%90%86%E5%88%97%E8%A1%A8%E4%BB%A5%E8%8E%B7%E5%8F%96%20Envname%20Number%20%E8%80%8C%E4%B8%8D%E6%98%AF%20Number.png)
我正在尝试重新定义定理列表环境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
更加强大。 - 更新 2:
swapnumber
与无数定理兼容。 - 更新 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
(将其缩短为\@xa
)thmtools
,依此类推。
\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}