环境论证中的扩展数学问题

环境论证中的扩展数学问题

我想手动重新定义定理的“可重述”环境。我不得不这样做,因为出于某些不为人知的原因,课程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}

在此处输入图片描述

请注意,不再需要inputencwith ,也不再需要。utf8xparse

我用的是“现代”的,\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}%
}{}

相关内容