通过 pgfkeys 实现类似 Python 的关键字参数

通过 pgfkeys 实现类似 Python 的关键字参数

我喜欢定义命令来表示多参数(数学)函数,例如,\myf{x}{C}扩展为f(x;C)。然而,在编写过程中,有时很难记住是否应该使用\myf{x}{C}\myf{C}{x},所以我想使用类似 Python 中的关键字参数的东西。在我的例子中,这意味着我想写\myf{set=C,at=x}\myf{at=x,set=C}并将 getf(x;C)作为两个命令的结果。为此,我使用了 pgfkeys;见下文。

我在对以下代码进行 pdflatex 处理时遇到错误:

\documentclass{article}
\usepackage{pgfkeys}
\usepackage{mathtools}
\usepackage{mathrsfs}
\pgfkeys{
  /myf/set/.estore in = \myfset,
  /myf/at/.estore in = \myfat,
}
\newcommand*{\myf}[1]{%
  \begingroup
  \pgfkeys{/myf/.cd, #1}
  f(\myfat;\myfset)
  \endgroup
}
\begin{document}
\(\myf{set=\mathscr{C},at=a}\)
\end{document}

我收到错误

<inserted text> 
                \inaccessible 
l.16 \(\myf{set=\mathscr{C},at=a}
                                 \)
?

\mathscr{C}如果我替换C或者删除该包mathtools(我需要其他功能),这个错误就会消失。

有人能帮我解决这个问题吗?谢谢!

答案1

只是为了好玩而使用 的解决方案l3keys。这里,键set默认为和\mathscr{A},因此您可以使用空参数。atc\myf{}

\documentclass{article}
\usepackage{xparse}
\usepackage{mathrsfs}
\ExplSyntaxOn

\keys_define:nn { mk1 }
 {
  set .tl_set:N  = \l_mk_set_tl   ,
  at  .tl_set:N  = \l_mk_at_tl    ,
  set .default:n = { \mathscr{A} },
  at  .default:n = { c }
 }

\NewDocumentCommand { \myf } { m }
 {
  \group_begin:
  \keys_set:nn { mk1 } { set,at,#1 }
  f( \tl_use:N \l_mk_at_tl ; \tl_use:N \l_mk_set_tl )
  \group_end:
 }
\ExplSyntaxOff
\begin{document}
\(\myf{set=\mathscr{C},at=a}\)
\(\myf{}\)
\end{document}

在此处输入图片描述

相关内容