以下是代码示例:
\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
的值执行扩展。title
name
ntheorem
顺便说一句,也会发生类似的事情。
如何解决这个问题?\protect
在“符号名称”前面使用。不,一个\noexpand
是不够的。由于thmtools
用途是\protected@edef
为了完成其工作,这\protect
将被更改为“无限\noexpand
”;但是,在排版文本时,\protect
与相同\relax
,因此它没有坏处。