我想定义一个定理环境,在其中我可以手动发出编号,而不是遵循一些内部计数器。环顾四周,我发现这答案。他们提出了以下代码作为解决方案:
\newtheorem{innercustomthm}{Theorem}
\newenvironment{customthm}[1]
{\renewcommand\theinnercustomthm{#1}\innercustomthm}
{\endinnercustomthm}
代码按我想要的方式工作,但是我试图理解代码中的所有内容,以防我想对它进行一些调整(并且也想了解我在文档中放了什么)并且有点卡住了。
首先, \newenvironment 具有以下结构:
\newenvironment{<env-name>}[<n-args>][<default>]{<begin-code>}{<end-code>}
我知道第三个参数留空;这没有问题。然后是 \renewcommand,其结构如下:
\renewcommand{<cmd>}[<n-args>][<default>]{<text>}
这里我很难理解发生了什么,因为没有使用括号;我想也许命令允许你省略它们,但我没有找到有关这方面的任何信息。之后它变得更加令人困惑,因为命令 \theinnercustomthm、\innercustomthm 和 \endinnercustomthm 似乎是为这个特定的解决方案定制的,我不明白它们是如何工作的。
例如,我注意到的一件事是,改变环境的名称(比如说 mytheo 而不是 customthm)会破坏代码。
如果有人能解释发生了什么,或者给我提供一些手册或网页,让我能够理解发生了什么,我将不胜感激。
答案1
首先要注意的是
\newtheorem{innercustomthm}{Theorem}
内部做了类似的事情
\newenvironment{innercustomthm}[1][]{<begin>}{<end>}
其中<begin>
和<end>
代码在这里不是问题。请注意,环境会查找可选参数(定理注释或归因)。它还会设置一个与环境同名的计数器。
所选名称故意很长而且不吸引人:这样的名称不太可能与现有或想象的环境发生冲突。
对于我们设想的应用程序,我们实际上不需要计数器,而是需要任何 的调用innercustomthm
都会步进计数器并设置所需的内容,以便下一个\label
命令将使用计数器的值。但是,LaTeX 不会查看值本身,而是使用 的当前含义\the<counter>
,在本例中为\theinnercustomthm
。 的含义\theinnercustomthm
也用于对环境进行编号。
我们的想法是手动对定理进行编号,因为我们需要引用与其他出版物相同的定理编号,因此自动编号是不可能的。好吧,我们制作一个包装器,它将以innercustomthm
我们希望语句具有的编号作为参数。
因此,这个想法是启动一个环境,采用一个参数,该参数将用于(本地)重新定义\theinnercustomthm
并调用“内部”环境,该环境将完成排版语句的工作。
可能的定义customthm
是
\newenvironment{customthm}[1]
{\renewcommand{\theinnercustomthm}{#1}\begin{innercustomthm}}
{\end{innercustomthm}}
但这有一个小缺点:如果你忘记了,你最终会得到“遗漏”提及\end{customthm}
的错误,而不是。所以,\end
innercustomthm
customthm
男子气概的程序员\begin
在这种情况下,使用和例程的内部版本\end
作为“内部”环境:簿记已经完成\begin{customthm}
,我们不需要重复。所以我们得到
\newenvironment{customthm}[1]
{\renewcommand{\theinnercustomthm}{#1}\innercustomthm}
{\endinnercustomthm}
嗯,你引用的实际代码是
\newenvironment{customthm}[1]
{\renewcommand\theinnercustomthm{#1}\innercustomthm}
{\endinnercustomthm}
为什么没有牙套?另一个(坏)习惯是男子气概的程序员谁知道那些支架是不必要的,而且无论如何都会被去掉。
如有疑问,请使用它们。
答案2
首先,我们应该问一下\newvironment{myenv}{..start code...}{...end code...}
到底做了什么。简单来说,发生的事情是\newenvironment
定义了两个命令\myenv
和\endmyenv
,其中\myenv
扩展为...start code...
并\endmyenv
扩展为...end code...
。当你写的时候,\begin{myenv}...\end{myenv}
LaTeX 用(几乎)等同于的代码替换这个环境{\myenv ... \endmyend}
。(幕后还发生了一些事情。)
接下来,该行将环境\newtheorem{innercustomthm}{Theorem}
定义innercustomthm
为使用计数器的“定理”环境innercustomthm
。具体来说,此环境的“定理数”使用 打印\theinnercustomthm
。
现在让我们考虑一下:
\newenvironment{customthm}[1]
{\renewcommand\theinnercustomthm{#1}\innercustomthm}
{\endinnercustomthm}
这定义了customthm
环境,它接受一个参数#1
。根据上面的第一段,\begin{customthm}[X]...\end{customthm}
扩展为:
{\renewcommand\theinnercustomthm{X}\innercustomthm ... \endinnercustomthm}
也就是说,\theinnercustomthm
被重新定义为等于,X
之后innercustomthm
应用环境。因此,customthm
环境本质上与环境相同,innercustomthm
只是\theinnercustomthm
首先设置为等于X
,其中X
是环境的参数customthm
。因此,最终结果是该环境打印:“定理 X”...
最后你说更改环境名称(mytheo
例如,改为customthm
)会破坏代码。如果我说的是正确的,那么这不可能是真的!事实上,如下面的代码所示,如果我们改变环境的名称,代码的工作方式完全相同:
\documentclass{article}
\newtheorem{innercustomthm}{Theorem}
\newenvironment{mytheo}[1]
{\renewcommand\theinnercustomthm{#1}\innercustomthm}
{\endinnercustomthm}
\begin{document}
\begin{innercustomthm}Hi
\end{innercustomthm}
\begin{mytheo}Hi
\end{mytheo}
\end{document}