thmtools - 当我更改定义它的命令时,Theorem 不会更改标题

thmtools - 当我更改定义它的命令时,Theorem 不会更改标题

以下是代码示例:

\documentclass[11pt, a4paper]{article}
\usepackage[utf8]{inputenc}

\usepackage{amsthm}
\usepackage{thmtools}

\newcommand\testTitle{Theorem}

\declaretheorem[title = \testTitle]{thm}

\renewcommand\testTitle{The theorem}

\begin{document}
    \begin{thm}
        This is a theorem.
    \end{thm}
\end{document}

此代码给出了以下输出。

我期望的输出是:

有没有办法用thmtools可重新定义的名称来定义定理?

答案1

欢迎!实现您想要的效果的一种快速(也许有点粗暴)方法是\protect在您希望发生这种情况之前先展开标题。(我也使用键,name但它title也可以与一起使用。根据手册,name似乎更通用一些。)

\documentclass[11pt, a4paper]{article}
\usepackage[utf8]{inputenc}

\usepackage{amsthm}
\usepackage{thmtools}

\newcommand\testTitle{Theorem}

\declaretheorem[name=\protect\testTitle]{thm}


\renewcommand\testTitle{The theorem}

\begin{document}
    \begin{thm}
        This is a theorem.
    \end{thm}
\end{document}

在此处输入图片描述

为什么你的代码没有给你想要的结果?因为title当你说

\declaretheorem[title = \testTitle]{thm}

使用\protect,即

 \declaretheorem[title =\protect\testTitle]{thm}

你阻止了这种事情的发生。

答案2

补充薛定谔的猫精彩答案

尝试注释掉 的定义\testTitle。当你在示例上运行 LaTeX 时,你将收到

! Undefined control sequence.
\thmt@thmname ->\testTitle

l.8 \declaretheorem[title = \testTitle]{thm}

哦,很奇怪,不是吗?如果你只用amsthm特征尝试同样的方法,

\documentclass[11pt, a4paper]{article}

\usepackage{amsthm}

\newtheorem{thm}{\testTitle}
\newcommand\testTitle{Theorem}

\renewcommand\testTitle{The theorem}

\begin{document}
    \begin{thm}
        This is a theorem.
    \end{thm}
\end{document}

您将看不到任何问题。请注意,的位置\newcommand{\testTitle}{...}无关紧要。

有什么区别?使用amsthm(或 LaTeX 内核的默认值\newtheorem) 时,不执行任何扩展。相反,对给定(或其别名)\declaretheorem的值执行扩展。titlename

ntheorem顺便说一句,也会发生类似的事情。

如何解决这个问题?\protect在“符号名称”前面使用。不,一个\noexpand是不够的。由于thmtools用途是\protected@edef为了完成其工作,这\protect将被更改为“无限\noexpand”;但是,在排版文本时,\protect与相同\relax,因此它没有坏处。

相关内容