我有一个宏,在调用之前需要一些设置代码:
\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 包的大列表有关其他可能的键值包的详细信息