如果使用环境的命令形式会发生什么?

如果使用环境的命令形式会发生什么?

尽管 tex.SX 警告我这似乎是一个主观问题,但事实并非如此。(我也不认为这是重复的,这是最接近的我找到了。)我想知道恰恰如果我执行以下操作会发生什么情况。

  1. 定义一个环境,或者使用已经提供的环境。将其命名为thm
  2. 回想一下,它应该被这样使用

    \begin{thm}
    stuff
    \end{thm}
    
  3. 偷懒的话可以这样做:

    \thm{stuff}
    

我看到至少编号工作正常,但显然我从未离开过环境。但这只是我看的 pdf;我真的不知道当我这样做时发生了什么。任何具体细节都将不胜感激,谢谢!

答案1

好问题,答案不会很简短,即使对“我可以使用环境的宏形式吗?”这个问题的简短回答是可能的,引用梅尔布鲁克斯的“无声电影”中的马塞尔马索的话:

首先,我记得\newenvironment{foo}[<n>]{<start>}{<end>}定义了宏\foo\endfoo,但仅仅因为它因为 TeX 只知道宏。

此类宏可用于定义其他环境,但绝不应出现在文档正文中。当我说绝不, 我是认真的。

因此代码如下

\newenvironment{foo}
  {a}
  {b}
\newenvironment{baz}
  {c\foo}
  {d\endfoo}

是合法的,甚至比 稍好一些\newenvironment{baz}{c\begin{foo}}{d\end{foo}},因为它节省了分组级别,并且在\end{baz}放错位置时会给出更好的错误消息。

正如关于同一主题的许多问题所显示的那样,在文档中使用\foo或可能会导致非常意想不到的结果。例如,\baz

\abstract{Text...}

对于大多数文档类来说,这会导致整个文档排版错误。请参阅abstract 环境会改变整个文档的 \linewidth其中有多个重复问题与其相关。

其他情况则更加明显错误:如果你尝试

\align{
<eq 1> \\
<eq 2> \\
<eq 3>}

根据您的尝试,您将会得到非常令人讨厌的惊喜。

环境主体几乎从来不是命令的参数,即使是,它也不是具有环境名称的宏的参数。

您的“懒惰”示例\thm{stuff}将为定理设置一些东西:步进计数器,排版标签并将字体更改为斜体。这就是 的工作\thm。在这种情况下{,和}不界定参数,而只是形成一个组;没什么大不了的,因为“东西”无论如何都会排版。但是,斜体将继续存在。

\begin\end不仅仅是占位符:它们可以执行多种操作。它们打开和关闭一个组,因此字体或线宽的更改将是本地的(请参阅示例abstract和有关带有的字体的注释\thm)。它们还设置当前环境名称,以便在嵌套不合适时为您提供帮助。该\end部分还在末尾添加了一些簿记,其中大多数基本环境(例如listhook at)都包含在内。

我并不是说懒惰不好,但上述言论足以让你停止尝试懒惰的。

相反,使用宏作为环境也是可行的。大多数情况下确实如此,但在某些情况下似乎工作;因此我不建议这样做。

答案2

从根本上\newenviroment{<env>}[<args>]{<begin>}{<end>}定义宏:一个与环境的开始相关,一个与环境的结束相关,简单地说就是

\begin{<env>}[<args>]
...
\end{<env>}

进入

\<env>[<args>]
...
\end<env>

但是,使用环境表单还以以下形式为环境中所做的任何更改提供了有限的范围:团体。例如,考虑

在此处输入图片描述

\documentclass{article}

\begin{document}

Lorem ipsum.

\begin{itemize}
  \item An item
  \item Another item
\end{itemize}

Lorem ipsum.

\itemize
  \item An item
  \item Another item

Lorem ipsum.

\end{document}

请注意,环境用法会itemize在 之后反转列表样式缩进,\end{itemize}而“惰性”方法(不带\end...)不会恢复常规布局。即使您要使用命令形式\<env>[<args>]... \end<env>,最好还是坚持使用环境。

本质上,这可能归结于您使用的环境。例如,定理往往在 期间设置其“QED” \end<theorem>。其他环境要求\end<env>(如tabularx或者listings甚至只是verbatim环境)。

相关内容