删除嵌套 keyval 中使用 keyval-value 的一级括号

删除嵌套 keyval 中使用 keyval-value 的一级括号

我已经使用 xkeyval 定义了我自己的图形命令,并且我想将嵌套的 \includegraphics 的参数作为它的一个键值传递(也许我删除了太多代码,但我希望你能明白):

\makeatletter
  \define@key[foo]{bar}{options}{\def\FooBarOptions{#1}}
  \define@key[foo]{bar}{label}{\def\FooBarLabel{#1}}
  \define@key[foo]{bar}{caption}{\def\FooBarCaption{#1}}
\makeatother

%\MySpecialFigure[keyvals]{filename}
\newcommand{\MySpecialFigure}[2][]{%
  \begingroup
    \setkeys[foo]{bar}{options={}, label={}, caption={}}
    \setkeys[foo]{bar}{#1}

    \begin{figure}
      \includegraphics[\FooBarOptions]{#2}
      \caption{\FooBarCaption}
      \label{\FooBarLabel}
    \end{figure}
  \endgroup
}

我想像这样使用它:

\MySpecialFigure[options={width=0.5\textwidth, draft}, 
                 label={fig:label},
                 caption={My Caption}]
{my-pic.png}

由于选项周围有括号,整个块被解析为一个值,\includegraphics其行为如下:

\includegraphics[{width=0.5\textwidth, draft}]{my-pic.png}

我收到错误:

Package xkeyval Error:'width=0.5\textwidth, draft' undefined in families 'Gin'

我试过

  \define@key[foo]{bar}{options}{\edef\FooBarOptions{#1}}

但这也不会剥去牙套。

我该如何解决这个问题?

答案1

您需要先展开,\FooBarOptions然后再将其输入到\includegraphics,否则它将被视为一个键。这与额外的一层括号无关。

转向

\includegraphics[\FooBarOptions]{#2}

进入

\expandafter\includegraphics\expandafter[\FooBarOptions]{#2}

应该修复它。

相关内容