如何通过参数命令构建新环境?

如何通过参数命令构建新环境?

虽然我经常使用 Stackexchange 寻找答案,但我还是个新手。有一次我找不到我要找的答案,所以我不得不问。我有点担心这是一个非常简单的问题,但我花了两天时间却没有找到答案。

假设我定义了一个新命令\newcommand{\boldit}[1]{\textbf{#1}}(我知道这个命令并不是很有用)。

现在我想用它构建一个环境。但我对括号有些问题:

\newenvironment{makeitbold}{%
    \boldit{
}{%
    }
}

我尝试用一​​对\bgroup \egroup或来替换某对,\begingroup \endgroup但是没有用。

\long\def我还尝试使用而不是来更改命令,\newcommand以便能够使用其他分隔符(例如,我尝试将其<>作为分隔符)。它对命令本身有效,但对环境无效。

总而言之,我想构建一个将其全部(或部分)内容传递给命令的环境。

我希望我解释清楚了。

答案1

通常人们是以相反的方式进行的:首先定义一个环境,然后从中派生出一个命令。

但是,有些地方这个功能还是很有用的。据我所知,问题出在amsmath(更准确地说是在最初的amslatex版本中)。这个包是从 中衍生出来的amstex,并且为了精通 LaTeX 而构建\align...\endalign\begin{align}...\end{align}

\align<math material>\endalign结构通过吸收<math material>作为论据来工作\align 界定为 \endalign.然后可以对材料进行两次处理,首先进行测量,然后进行打印。

在 LaTeX 中设计了一种实现相同功能的方法,即吸收材料作为宏的参数,并用 分隔\end{align}。我不会介绍该过程的细节。几年后,其他人发现,同样的机制在不同情况下也很有用,当我们需要环境内容时,可以对其进行处理、测量、拆分,以便稍后输出我们需要的内容。

这使得包environ出现。所以如果你

\usepackage{environ}

\newcommand{\boldit}[1]{\textbf{#1}}

\NewEnviron{makeitbold}{\boldit{\BODY}}

你得到了你想要的结果。当然,这只是一个(不好的)用法示例。

更好的替代方案是使用xparse,你可以将b参数类型传递\NewDocumentEnvironment

\usepackage{xparse}

\NewDocumentCommand{\boldit}{m}{\textbf{#1}}

\NewDocumentEnvironment{makeitbold}{b}
 {\boldit{#1}}
 {}

+b如果您的环境包含整个段落,您可以使用。

相关内容