我想定义一个新环境,其实现依赖于另一个环境。第一个环境应接受一个键值选项列表。其中一些选项仅适用于第一个环境。第一个环境不知道的所有选项都将传递给另一个环境。
是否有任何包可以处理 LaTeX 中的选项过滤?
答案1
有多种 key=value 包,您可以针对这些包执行以下操作(实际上,每个 key=value 包都允许您自己定义未知处理程序)。我将展示使用expkv
此方法的一个例子(免责声明:我是expkv
的作者)。
\documentclass{article}
\usepackage{tcolorbox}
\usepackage{expkv-def}
\ekvdefinekeys{myenv}
{
store blubb = \myenvBlubb
,store foo = \myenvFoo
,store bar = \myenvBar
% this implements the filtering, instead of throwing errors for unknown keys
% we store them in a list
,protected unknown noval =
\edef\myenvUnknown{\unexpanded\expandafter{\myenvUnknown,#1}}
,protected unknown code =
\edef\myenvUnknown{\unexpanded\expandafter{\myenvUnknown,#1= {#2}}}
% some auxiliary keys to restore the unknown list to empty
,protected noval clear-unknowns = \let\myenvUnknown\empty
% initialise the empty unknown-list
,initial clear-unknowns
}
\newenvironment{myenv}[1]
{%
\ekvset{myenv}{#1}%
\expanded{\unexpanded{\begin{tcolorbox}}\expandafter}%
\expandafter[\myenvUnknown]%
}
{%
\tcblower
blubb: \myenvBlubb\\
foo: \myenvFoo\\
bar: \myenvBar\\
\end{tcolorbox}%
}
\begin{document}
\begin{myenv}{colback=blue!30!white,bar=EC,title=example, foo=Foobar}
This is an example.
\end{myenv}
\end{document}
另一种方法是使用 key=value 实现,该实现支持仅设置已知键并使用某些特殊语法将未知键存储在列表中(这不需要您像上面那样自己编写列表构建代码)。 其中一个实现是使用l3keys
其\keys_set_known:nnN
。
\documentclass{article}
\usepackage{tcolorbox}
\ExplSyntaxOn
\tl_new:N \l__myenv_unknown_tl
\keys_define:nn { myenv }
{
blubb .tl_set:N = \l__myenv_blubb_tl
,foo .tl_set:N = \l__myenv_foo_tl
,bar .tl_set:N = \l__myenv_bar_tl
}
\newenvironment{myenv}[1]
{%
\keys_set_known:nnN { myenv } {#1} \l__myenv_unknown_tl
\exp_last_unbraced:NnNo \begin { tcolorbox } [ \l__myenv_unknown_tl ]
}
{%
\tcblower
blubb:~ \l__myenv_blubb_tl\\
foo:~ \l__myenv_foo_tl\\
bar:~ \l__myenv_bar_tl\\
\end{tcolorbox}%
}
\ExplSyntaxOff
\begin{document}
\begin{myenv}{colback=blue!30!white,bar=EC,title=example, foo=Foobar}
This is an example.
\end{myenv}
\end{document}
两个代码块都给出相同的结果: