我想定义一个环境,在处理之前读取其内容(比如\newEnviron
从包中environ
),但也允许键值参数(比如从我通常使用的\newkeyenvironment
包中)。keycommand
我应该怎么做?
答案1
\documentclass{article}
\usepackage{keyval}% http://ctan.org/pkg/keyval
\usepackage{environ}% http://ctan.org/pkg/environ
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\makeatletter
\define@key{mykeys}{font}{\def\envfont{#1}}%
\makeatother
\NewEnviron{myenv}[1][]{%
\setkeys{mykeys}{font=\normalfont,#1}% Set default and updated keys
\envfont\BODY% Set contents in font \envfont
}
\begin{document}
\lipsum[1]
\begin{myenv}[font=\bfseries\itshape]
\lipsum[1]
\end{myenv}
\end{document}
上述示例myenv
使用 给出的键值设置环境的字体font
。键值存储在系列中,mykeys
默认font=\normalfont
为。有关设置键值对的更多信息,请参阅如何创建带有键值的命令?
lipsum
提供乱数-style 虚拟文本。
答案2
没有什么特别的:假设你已经定义了一个bar
键系列
\NewEnviron{foo}[1]{%
\setkeys{bar}{#1}%
do something with \BODY
}
或者
\NewEnviron{foo}[1][]{%
\setkeys{bar}{#1}%
do something with \BODY
}
将允许语法
\begin{foo}{key1=value1,key2=value2}
text
\end{foo}
或者
\begin{foo}[key1=value1,key2=value2]
text
\end{foo}
选择哪一个取决于许多因素:如果用户有至少提供一个键值对,则建议使用第一种形式。
我已经使用过\setkeys
,因为我不知道它是如何keycommand
工作的(无论如何它应该非常相似)。