虽然我经常使用 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
如果您的环境包含整个段落,您可以使用。