![通过 pgfkeys 实现类似 Python 的关键字参数](https://linux22.com/image/304081/%E9%80%9A%E8%BF%87%20pgfkeys%20%E5%AE%9E%E7%8E%B0%E7%B1%BB%E4%BC%BC%20Python%20%E7%9A%84%E5%85%B3%E9%94%AE%E5%AD%97%E5%8F%82%E6%95%B0.png)
我喜欢定义命令来表示多参数(数学)函数,例如,\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}
,因此您可以使用空参数。at
c
\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}