我正在编写一组定理及其证明,这些定理和证明对应于已出版书籍中出现的几个没有证明(或只有极少证明草图)的定理。我正在使用 thmtools 来指定定理和证明环境。
当然,我的文章中定理的编号与原文中相应定理的编号相匹配是很重要的。本书中的许多定理都是“对偶”形式出现的,本书采用了以下示例所示的排版惯例:定理 VI.2.1* 是定理双重的定理 VI.2.1。
是否有某种方法可以(通过 thmtools)定义“对偶定理”环境,并为其产生正确的“星号”定理数?
编辑:FWIW,这是我对定理环境使用的定义:
\declaretheoremstyle[%
spaceabove=4ex%
]{thmstyle}
\declaretheorem[%
name={Theorem},%
numberwithin=section,%
style=thmstyle,%
]{thm}
PS:如果这个环境还可以根据原始定理的陈述自动生成对偶定理的陈述,甚至根据原始证明自动生成证明,那就太酷了,但这确实会突破 LaTeX 的极限...:)
编辑2:这是我尝试实施egreg的建议:
%% the following block is meant to replace egreg's original
%% \newtheorem*{dualthm*}{Theorem \dualnumber\rlap{*}}
\declaretheorem[%
name={Theorem \dualnumber\rlap{*}},%
style=thmstyle,% %% see earlier Edit for the definition of thmstyle
unnumbered,%
]{dualtheorem}
%% `dualthm` below is almost identical to egreg's `dualthm`, except that
%% it refers to `\dualtheorem` instead of `\dualthm*`.
\newenvironment{dualthm}[1]
{\newcommand\dualnumber{\ref{#1}}\begin{dualtheorem}}
{\end{dualtheorem}}
不幸的是,它失败了:
! Undefined control sequence.
\thmt@thmname ->Theorem \dualnumber
\rlap {*}
l.50 ]{dualtheorem}
?
我理解(我认为)egreg 的方案在做什么,但我不知道如何将其转换为 thmtools,因为与 不同newtheorem*
,thmtooldeclaretheorem
显然不允许在其规范中提及未定义的符号。顺便说一句,我尝试了上述的多种变体,但由于某种原因,它们都失败了。不过,我在这方面还是个菜鸟,所以很可能我遗漏了一些显而易见的东西。如果是这样,请告诉我。
答案1
应该很容易适应以下方案thm工具
\documentclass[a4paper]{book}
\usepackage{amsthm}
\newtheorem{thm}{Theorem}[chapter]
\newtheorem*{dualthm*}{Theorem \dualnumber\rlap{*}}
\newenvironment{dualthm}[1]
{\newcommand\dualnumber{\ref{#1}}\begin{dualthm*}}
{\end{dualthm*}}
\begin{document}
\mainmatter
\chapter{One}
\section{One}
\begin{thm}\label{one}
$a=b$
\end{thm}
\begin{dualthm}{one}
$b=a$
\end{dualthm}
\end{document}
因此,它dualthm
实际上不是一个“类定理”环境,而子定理dualthm*
是,但作为一个无数定理。编号是通过\ref
每次定义临时命令获得的\dualnumber
。
为了自动对偶一个语句,应该知道涉及哪种对偶性。如果是布尔代数对偶性,也许可以做到;射影空间中的对偶性则更难。
编辑
以下是将上述代码适配到thm工具
\let\dualnumber\relax
\declaretheorem[%
name={Theorem \dualnumber\rlap{*}},%
style=thmstyle,%
unnumbered,%
]{dualthm*}
\newenvironment{dualthm}[1]
{\newcommand\dualnumber{\ref{#1}}\begin{dualthm*}}
{\end{dualthm*}}
由于技术原因,\dualnumber
在使用它之前应该有一个定义\declaretheorem
。