通过将命令的值设置\moveToAppendix
为 ,以下 Latex 代码允许我自动创建一个附录,其中存储证明1
。
\documentclass[a4paper,USenglish]{article}
\usepackage{amssymb,amsthm,amsmath}
\usepackage{thmtools, thm-restate}
\newtheorem{theorem}{Theorem}
\newcommand{\moveToAppendix}{1}
\newenvironment{varProof}[1]
{
\restatable{proof}{#1}
}
{
\endrestatable
}
\begin{document}
\begin{theorem}
Toto.
\end{theorem}
\begin{varProof}{ProofOne}
Tata.
\end{varProof}
\if\moveToAppendix1
\newpage
\appendix
\section{Auxiliary proofs}
\ProofOne
\fi
\end{document}
问题是,当\moveToAppendix
设置为时1
,证明仍然保留在论文的主体部分(附录之外),当的值\moveToAppendix
设置为时,我该如何使它们不可见1
?
编辑:
在发表评论之后,我决定包含一个我想要的例子,但像下面这样定义每个证明有点麻烦,我想知道是否可以在环境中以更简单的方式定义它,以便每次放置证明时使用。
\documentclass[a4paper,USenglish]{article}
\usepackage{amssymb,amsthm,amsmath}
\usepackage{thmtools, thm-restate}
\newtheorem{theorem}{Theorem}
\newcommand{\moveToAppendix}{0}
\newenvironment{varProof}[1]
{
\begin{proof}{#1}
}
{
\end{proof}
}
\begin{document}
\begin{theorem}
Toto.
\end{theorem}
\newcommand{\ProofOne}{
\begin{proof}
Tata.
\end{proof}
}\if\moveToAppendix0\ProofOne\fi
\if\moveToAppendix1
\newpage
\appendix
\section{Auxiliary proofs}
\label{appendix:aux}
\ProofOne
\fi
\end{document}
答案1
问题是\restatable
打印调用该定理的地方的内容。
不同的方法可能是使用\savebox
然后在附录中调用它。
\documentclass[a4paper,USenglish]{article}
\usepackage{xparse}
\usepackage{amssymb,amsthm,amsmath}
\usepackage{thmtools, thm-restate}
\newtheorem{theorem}{Theorem}
\newcommand{\moveToAppendix}{1}
\NewDocumentEnvironment{varProof}{mb}{
\expandafter \newsavebox \csname#1box\endcsname
\expandafter \global \expandafter \sbox \csname#1box\endcsname {%
\parbox { \columnwidth } {
\begin{theorem}
#2
\end{theorem}
}}
\expandafter \gdef \csname#1\endcsname {%
\expandafter\usebox\csname#1box\endcsname
}
\if\moveToAppendix0
\noindent\csname#1\endcsname
\fi
}{}
\begin{document}
\begin{theorem}
Toto.
\end{theorem}
\begin{varProof}{ProofOne}
Tata.
\end{varProof}
\if\moveToAppendix1
\newpage
\appendix
\section{Auxiliary proofs}
\ProofOne
\fi
\end{document}
\begin{varProof}
但请注意,使用此方法,定理数将基于称为,而不是最终在附录中打印的位置。
编辑:对于较旧的(2019 年之前)TeX 安装,我们需要使用该Environ
包。
\usepackage{environ}
\NewEnviron{varProof}[1]{
\expandafter \newsavebox \csname#1box\endcsname
\expandafter \global \expandafter \sbox \csname#1box\endcsname {%
\parbox { \columnwidth } {
\begin{theorem}
\BODY
\end{theorem}
}}
\expandafter \gdef \csname#1\endcsname {%
\expandafter\usebox\csname#1box\endcsname
}
\if\moveToAppendix0
\noindent\csname#1\endcsname
\fi
}
答案2
也许是这样的?
代码
\documentclass{article}
\usepackage{amsthm}
\usepackage{environ}
\newif\ifmoveprooftoend
\newcommand\showDeferredProofs{}
\makeatletter
\NewEnviron{movableProof}[1][Proof]{%
\ifmoveprooftoend
\edef\next{\noexpand\g@addto@macro\noexpand\showDeferredProofs{%
\noexpand\begin{proof}[#1]\unexpanded\expandafter{\BODY}\noexpand\end{proof}}}
\next
\else
\begin{proof}[#1]\BODY\end{proof}
\fi}{}
\makeatother
\newtheorem{thm}{Theorem}
\begin{document}
\begin{thm}
First theorem
\end{thm}
\begin{movableProof}
Proof of first theorem
\end{movableProof}
\moveprooftoendtrue
\begin{movableProof}[Alternative proof of first theorem]
Alternate proof
\end{movableProof}
\moveprooftoendfalse
\begin{thm}
Second theorem
\end{thm}
We give the heuristics of the proof here, and defer the full proof later.
\begin{movableProof}[Heuristic argument]
Heuristics of second theorem
\end{movableProof}
\moveprooftoendtrue
\begin{movableProof}[Actual proof of second theorem]
Proof of second theorem
\end{movableProof}
\begin{thm}
Really a lemma
\end{thm}
\begin{movableProof}
Lemma's proof is still deferred
\end{movableProof}
\section{Deferred proofs}
\showDeferredProofs
\end{document}
解释
\newif\ifmoveprooftoend
\newcommand\showDeferredProofs{}
既然您确实想要一个布尔切换,不妨使用 a\newif
而不是 a 来定义它\newcommand
。这样,\if
测试就可以更容易地编写。
您可以使用 打开切换开关,\moveprooftoendtrue
或者使用 关闭切换开关\moveprooftoendfalse
。
创建该\showDeferredProofs
命令是为了让您能够收集所有延迟的证明并使用单个命令一次性打印它们(而不是零碎的\ProofOne
方法)。
\makeatletter
\NewEnviron{movableProof}[1][Proof]{%
\ifmoveprooftoend
\edef\next{\noexpand\g@addto@macro\noexpand\showDeferredProofs{%
\noexpand\begin{proof}[#1]\unexpanded\expandafter{\BODY}\noexpand\end{proof}}}
\next
\else
\begin{proof}[#1]\BODY\end{proof}
\fi}{}
\makeatother
我们定义一个名为 的新环境movableProof
。它的作用是测试布尔切换的当前值\ifmoveprooftoend
。如果是错误的那么它充当标准proof
环境。如果它是真的,它会附加到\showDeferredProofs
必要的配料中,以便稍后打印证明。(使用 的技巧\edef\next
是因为我们想\BODY
在将其附加到 之前扩展一个级别\showDeferredProofs
。)