具有命名可选参数的 Latex 环境

具有命名可选参数的 Latex 环境

有没有办法在\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 接口那样很好地扩展,它的主要优点是完全可扩展,这对于在环境中使用来说是绝对不必要的......)。\endexpkv-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}

输出如上。

相关内容