有没有办法在\NewDocumentEnvironment
或中获取字符串选项\newenvironment
?
IE
\begin{foo}[color=red,size=12pt]
\end{foo}
其中环境定义为
\NewDocumentEnvironment{foo}{}
{
...start something
}
{
...end something
}
这是我实际需要的简化版本,但我没有将其过于具体和复杂化,而是简化了问题以使其更容易理解。
答案1
您可以使用大多数(任何?)已知的 key=value 接口,例如以下用途expkv
(使用 提供的键定义前端expkv-def
)来设置您的密钥。(免责声明:我是expkv
的作者)
您可以使用的其他值得注意的软件包包括:
keyval
(非常基础,但比任何其他解决方案都快,存在有关剥离括号的错误,但大多数情况下这不是一个问题)l3keys
(编程接口的一部分expl3
)\DeclareKeys
/\SetKeys
(LaTeX 内核的一部分,另一个接口l3keys
)pgfkeys
(与 类似keyval
,但功能更丰富)
\documentclass{article}
\usepackage{expkv-def}
\usepackage{xcolor}
\makeatletter
\ekvdefinekeys{foo}
{
store color = \foo@color
,edimen size = \foo@size
}
\NewDocumentEnvironment{foo}{O{}}
{%
\ekvset{foo}{#1}%
start something
\color{\foo@color}%
\fontsize{\foo@size}{\fpeval{1.2*\foo@size}pt}\selectfont
}
{%
end something
}
\makeatother
\begin{document}
\begin{foo}[color=red,size=12pt]
Some contents.
\end{foo}
\end{document}
如果您不需要环境中末尾部分的任何键值(或者使用两个不同的键宏,一个在中,\begin
一个在部分中,如果您不介意解析两次),那么您也可以使用,使用它来定义具有几个键的小宏非常简单(但请注意,它不能像其他 key=value 接口那样很好地扩展,它的主要优点是完全可扩展,这对于在环境中使用来说是绝对不必要的......)。\end
expkv-cs
\documentclass[border=3.14]{standalone}
\usepackage{expkv-cs}
\usepackage{xcolor}
\makeatletter
% \ekvcSplit sets up a macro using up to nine different keys as ordinary
% arguments in the replacement text. Comments after the keys just to keep track
% of the argument numbers, not necessary for its syntax.
\ekvcSplit\fookeys
{
color = black % #1
,size = \f@size % #2
}
{%
\color{#1}%
\fontsize{#2}{\fpeval{1.2*#2}pt}\selectfont
}
\NewDocumentEnvironment{foo}{O{}}
{%
start something
\fookeys{#1}%
}
{%
end something
}
\makeatother
\begin{document}
\begin{foo}[color=red,size=12pt]
Some contents.
\end{foo}
\end{document}
输出如上。