帮助解释此命令的语法

帮助解释此命令的语法

我想定义一个定理环境,在其中我可以手动发出编号,而不是遵循一些内部计数器。环顾四周,我发现答案。他们提出了以下代码作为解决方案:

\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}的错误,而不是。所以,\endinnercustomthmcustomthm男子气概的程序员\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}

相关内容