我正在尝试理解并修改此代码:
\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。定义中的\relax
after只是为了停止查找可选参数(我们已经知道它不在那里),因此获得了一些纳秒。\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}