向环境添加可选参数

向环境添加可选参数

我正在尝试理解并修改此代码:

\newtheorem*{nonamethm}{\nonamethmname}
\newcommand{\nonamethmname}{}

\newenvironment{genthm}[1]
 {\renewcommand{\nonamethmname}{#1}\nonamethm}
 {\endnonamethm}
\newenvironment{genthm*}[1]
 {\renewcommand{\nonamethmname}{#1}\nonamethmcheck}
 {\endnonamethm}

\newcommand\nonamethmcheck[1][]{%
  \if\relax\detokenize{#1}\relax
    \nonamethm\relax
  \else
    \nonamethm[#1]%
  \fi
  \mbox{}%
}

这是由 @egreg 在我之前的一个问题。它运行完美,但我不明白为什么,现在我想扩展它的功能。

有了这个代码我就可以写

\begin{genthm}
Theorem statement
\end{genthm}

代替

\newtheorem{arbitraryname}
\begin{arbitraryname}
Theorem statement
\end{arbitraryname}

我想了解这段代码是如何工作的据我所知,\relax实际上什么都不做,但我无法理解其他部分。例如,符号有%什么作用,还是只是一个“空”注释?空命令呢\newcommand{\nonamethmname}{}

最后,我想知道扩展上述命令的最佳方法是什么,以便我可以选择指定定理样式。理想情况下,我可以执行 \begin{genthm}{definition} 定义语句。 \end{genthm} 以避免必须编写\theoremstyle{definition}。如果省略第二个参数,则应默认为\theoremstyle{plain},这是默认值。

这可能吗?

答案1

这个技巧很简单:我们定义一个通用的未编号定理,其中定理标签不是明确地以单词形式给出,而是以我们可以随意重新定义的宏形式给出。

重新定义发生在环境围绕这个新定义的定理环境:当你说

\begin{genthm}{Name}

环境重新定义\nonamethmname为参数,在本例中Name,并启动nonamethm将排版语句的环境。最后,我们关闭nonamethm。在genthm*我们延迟打开环境时nonamethm,首先查找“归因”可选参数,因为我们想要发出,\mbox{}所以enumerate将在换行符后开始。\if\relax\detokenize{#1}\relax如果缺少可选参数,则测试返回 true。定义中的\relaxafter只是为了停止查找可选参数(我们已经知道它不在那里),因此获得了一些纳秒。\begin{nonamethm}genthm*

为了做你想做的事情,你需要为你计划使用的每种风格定义一个通用的无编号定理,因为风格是在定义时选择的。

扩展定义以满足您的请求很容易,但使用起来更方便xparse

\documentclass{article}
\usepackage{amsthm}
\usepackage{xparse}

\newtheorem*{nonamethmplain}{\nonamethmname}
\theoremstyle{definition}
\newtheorem*{nonamethmdefinition}{\nonamethmname}
\theoremstyle{remark}
\newtheorem*{nonamethmremark}{\nonamethmname}
\newcommand{\nonamethmname}{}

\NewDocumentEnvironment{genthm}{O{plain}m}
 {\renewcommand{\nonamethmname}{#2}\begin{nonamethm#1}}
 {\end{nonamethm#1}}
\NewDocumentEnvironment{genthm*}{O{plain}mo}
 {\renewcommand{\nonamethmname}{#2}%
  \IfNoValueTF{#3}
    {\begin{nonamethm#1}\relax}%
    {\begin{nonamethm#1}[#3]}%
  \mbox{}}
 {\end{nonamethm#1}}

\begin{document}

\begin{genthm}{Hairy ball theorem}
Whatever it says
\end{genthm}

\begin{genthm}[definition]{Transcendental number}
A \emph{transcendental} number is a number that is not algebraic.
Easy, no?
\end{genthm}

\begin{genthm}[remark]{Easy remark}[J. de La Palice]
Everything is easy when it is.
\end{genthm}

\begin{genthm*}[definition]{Bunch of definitions}
\begin{enumerate}
\item A
\item B
\item C
\end{enumerate}
\end{genthm*}

\end{document}

环境genthm现在寻找一个可选参数(默认plain)并将其附加到nonamethm以选择正确的样式。

请注意,由于中的功能,最终归因可选参数仍然有效xparse

在此处输入图片描述

请对您的读者友好并向他们提供定理数字。

答案2

我只是从 egreg 对链接问题的回答中偷了代码使“enumerate”从新行开始

并重新定义了genthm环境,包装*和无星号版本在一起(带有一些次要的警告,星星的位置)并添加了可选参数。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}

\usepackage{xparse}
\usepackage{amsthm}

\newtheorem*{nonamethm}{\nonamethmname}
\newcommand{\nonamethmname}{}


\newcommand\nonamethmcheck[1][]{%
  \if\relax\detokenize{#1}\relax
    \nonamethm\relax
  \else
    \nonamethm[#1]%
  \fi
  \mbox{}%
}


\NewDocumentEnvironment{genthm}{s+om}{%
  \IfBooleanTF{#1}{% Check for starred version 
    \IfValueTF{#2}{%  Check for optional 2nd argument
      \theoremstyle{#2}%
    }{}%
    \renewcommand{\nonamethmname}{#3}\nonamethmcheck%
  }{% No, it's the unstarred versions
    \IfValueTF{#2}{%
      \theoremstyle{#2}%
    }{}
    \renewcommand{\nonamethmname}{#3}\nonamethm%
  }%
}{%
  \endnonamethm%
}



\begin{document}

%\begin{aenv}*
%Something
%\end{aenv}

\begin{genthm}*{Teoremi del quoziente}
\begin{enumerate}
\item Se $\lim\limits_{x \to \alpha} |f(x)| = +\infty$,
  allora $\lim\limits_{x \to \alpha} \frac{1}{f(x)} = 0$.

\item Se $\lim\limits_{x \to \alpha} f(x) = 0$,
  allora $\lim\limits_{x \to \alpha} \frac1{|f(x)|} = +\infty$.

\item Se $\lim\limits_{x \to \alpha} f(x) = l \neq 0$,
  allora $\lim\limits_{x \to \alpha} \frac1{f(x)} = \frac{1}{l}$.

\item Se $\lim\limits_{x \to \alpha} f(x) = l$ e $\lim\limits_{x \to \alpha} g(x) = m \neq 0$,
  allora $\lim\limits_{x \to \alpha} \frac{f(x)}{g(x)} = \frac{l}{m}$.
\end{enumerate}
\end{genthm}

\begin{genthm}*{Teoremi del quoziente}
Siano $f$ e $g$ funzioni definite in un intorno bucato di~$\alpha$.
\begin{enumerate}
\item Se $\lim\limits_{x \to \alpha} |f(x)| = +\infty$,
  allora $\lim\limits_{x \to \alpha} \frac{1}{f(x)} = 0$.

\item Se $\lim\limits_{x \to \alpha} f(x) = 0$,
  allora $\lim\limits_{x \to \alpha} \frac1{|f(x)|} = +\infty$.

\item Se $\lim\limits_{x \to \alpha} f(x) = l \neq 0$,
  allora $\lim\limits_{x \to \alpha} \frac1{f(x)} = \frac{1}{l}$.

\item Se $\lim\limits_{x \to \alpha} f(x) = l$ e $\lim\limits_{x \to \alpha} g(x) = m \neq 0$,
  allora $\lim\limits_{x \to \alpha} \frac{f(x)}{g(x)} = \frac{l}{m}$.
\end{enumerate}
\end{genthm}

\end{document}

在此处输入图片描述

相关内容