![环境论证中的扩展数学问题](https://linux22.com/image/469570/%E7%8E%AF%E5%A2%83%E8%AE%BA%E8%AF%81%E4%B8%AD%E7%9A%84%E6%89%A9%E5%B1%95%E6%95%B0%E5%AD%A6%E9%97%AE%E9%A2%98.png)
我想手动重新定义定理的“可重述”环境。我不得不这样做,因为出于某些不为人知的原因,课程jloganal
(逻辑与分析杂志)搞砸了:重述时,定理会有一个与重述部分相对应的新编号。杂志建议“伪造环境”并完全重写。我不喜欢这个“解决方案”。顺便说一句,这个练习是提高我的 Latex 技能的好机会。
以下是一次尝试:
\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{xparse}
\NewDocumentEnvironment{restate}{mmmb}{
\expandafter\xdef\csname #2\endcsname{#4}
\begin{#1}\label{#3}#4\end{#1}
}{}
\newtheorem{thm}{Theorem}
\begin{document}
\begin{restate}{thm}{thmun}{thmlabel}
test-text $\forall x\in\mathbb{R}\quad f(x)=1$
\end{restate}
\thmun
\end{document}
我的问题是\mathbb{R}
导致错误:
26:未定义的控制序列。\end
26:未定义的控制序列。\end
26:未定义的控制序列。\end
26:未定义的控制序列。\end
27:缺少插入的 {。\thmun
:扫描 \errhelp 文本时文件结束。
另外,我正在寻找一个行为如下的命令:\getEnvName{thm}
会写入Theorem
。
感谢您的帮助。
答案1
为什么\xdef
?你只是想要\gdef
。
更好的方法是存储 alse\begin{thm}
并在重述中\end{thm}
进行本地重新定义\thethm
,以使数字一致。
\documentclass[10pt,a4paper]{article}
%\usepackage[utf8]{inputenc}% no longer needed
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{xparse}% no longer needed
\NewDocumentEnvironment{restate}{mmmb}{%
\ExpandArgs{c}\gdef{#2}{%
\begingroup
\ExpandArgs{c}\renewcommand{the#1}{\ref{#3}}%
\begin{#1}#4\end{#1}%
\addtocounter{#1}{-1}%
\endgroup
}%
\begin{#1}\label{#3}#4\end{#1}
}{}
\newtheorem{thm}{Theorem}
\begin{document}
\begin{restate}{thm}{thmun}{thmlabel}
test-text $\forall x\in\mathbb{R}\quad f(x)=1$
\end{restate}
\thmun
\end{document}
请注意,不再需要inputenc
with ,也不再需要。utf8
xparse
我用的是“现代”的,\ExpandArgs{c}\gdef{...}
而不是笨拙的
\expandafter\gdef\csname...\endcsname
对于您的特定设置,我不会寻求更大的普遍性。
\documentclass[10pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amssymb}
\newtheorem{thm}{Theorem}
\newtheorem{restatable}[thm]{\protect\restatablename}
\newcommand{\restatablename}{}% initialize
\NewDocumentEnvironment{restate}{mmmb}{%
% #1 = theorem header, #2 = symbolic name, #3 = label, #4 = contents
\renewcommand{\restatablename}{#1}%
\ExpandArgs{c}\gdef{#2}{%
\begingroup
\renewcommand{\thethm}{\ref{#3}}%
\renewcommand{\restatablename}{#1}%
\begin{restatable}#4\end{restatable}%
\addtocounter{thm}{-1}%
\endgroup
}%
\begin{restatable}\label{#3}#4\end{restatable}
}{}
\begin{document}
\section{Introduction}
\begin{restate}{Theorem}{mainthm}{thmlabel}
test-text $\forall x\in\mathbb{R}\quad f(x)=1$
\end{restate}
\begin{restate}{Proposition}{importantprop}{proplabel}
test-text $0=0$
\end{restate}
\section{Proofs}
\mainthm
\importantprop
\end{document}
答案2
有很多方法可以解决这个问题。最简单的方法是使用\protected@xdef
:
\makeatletter% https://tex.stackexchange.com/q/8351/5764
\NewDocumentEnvironment{restate}{ m m m b }{%
\expandafter\protected@xdef\csname #2\endcsname{#4}%
\begin{#1}\label{#3}#4\end{#1}%
}{}
\makeatother
\let
但是您也可以通过暂时将它们更改为来避免内容的扩展(从而在定义中修复它们)\relax
:
\NewDocumentEnvironment{restate}{ m m m b }{%
\begin{#1}\label{#3}#4\end{#1}%
% Temporarily deactivate macros for definition following below
\let\mathbb\relax
\expandafter\xdef\csname #2\endcsname{#4}%
}{}