创建使用宏的环境

创建使用宏的环境

我有一个宏,在调用之前需要一些设置代码:

\documentclass{minimal}
\usepackage{color}
\begin{document}
% some setup code
\colorbox{green}{This is green.}
% some cleanup code
\end{document}

一切都很好,但我不喜欢重复设置/清理代码。

如何使用环境获得类似的结果?这样,我可以将设置代码放在“开始”部分,将清理代码放在“结束”部分。

我尝试了以下方法,但显然它不起作用:

\documentclass{minimal}
\usepackage{color}

% % % % THIS DOES NOT WORK % % % %
\newenvironment{green}{\colorbox{green}\begingroup}{\endgroup}
% % % % THIS DOES NOT WORK % % % %

\begin{document}

\begin{green}
This should be green as well.
\end{green}

\end{document}

! Extra }, or forgotten \endgroup.这给出了我认为的错误,\begingroup并且\endgroup专门用于不平衡的情况。

我有什么选择?

答案1

在此处输入图片描述

您可以使用lrbox环境来收集内容。

\documentclass{minimal}
\usepackage{color}


\newenvironment{green}
{\begin{lrbox}{0}}
{\end{lrbox}\colorbox{green}{\usebox{0}}}


\begin{document}

\begin{green}
This should be green as well.
\end{green}

\end{document}

答案2

您可以通过与宏类似的方式管理环境environ

在此处输入图片描述

\documentclass{article}
\usepackage{environ}% http://ctan.org/pkg/environ
\usepackage{xcolor}% http://ctan.org/pkg/xcolor

\NewEnviron{green}{\colorbox{green}{\BODY}}%

\begin{document}

\colorbox{green}{This should be green as well.}

\begin{green}
This should be green as well.
\end{green}

\end{document}

环境内容被抓取并存储在 中\BODY,然后可以将其传递给宏。但是,这不支持装箱verbatim内容,而 -approachlrbox可以做到这一点。

答案3

虽然其他答案很好地回答了 OP 的问题,但没有人提到使用键。我会采取与 @DavidCarlisle 非常相似的方法(尽管我也喜欢 @Werner 的方法)。但是,我会创建键来管理颜色(可能还有其他设置材料) 以便我稍后可以在文档中更改颜色以满足特定用途。

OP 的评论设置代码让我开始思考钥匙。

以下是 MWE:

\documentclass{article}
\usepackage{pgfkeys}
\usepackage{xcolor}

\pgfkeys{/jt/colored/box/.cd,
  color/.initial = green,
}

\newsavebox{\mycolorBox}
\newenvironment{mycolor}[1][green]
  {\pgfkeys{/jt/colored/box/.cd,color=#1}%%'
   \begin{lrbox}{\mycolorBox}}
  {\end{lrbox}%%'
   \colorbox
     {\pgfkeysvalueof{/jt/colored/box/color}}%%'
     {\usebox{\mycolorBox}}}
\pagestyle{empty}
\begin{document}

   \begin{mycolor}
    Green box
   \end{mycolor}

   \begin{mycolor}[blue!20]
    Blue box
   \end{mycolor}

\end{document}

在此处输入图片描述

关于密钥,有很多不错的软件包可以处理密钥。最近,我一直在尝试pgfkeys或使用l3keys。但还有许多其他这样的软件包:请参阅每个 keyval 包的大列表有关其他可能的键值包的详细信息

相关内容