我正在尝试根据示例代码学习 pgfkeys如何创建带有键值的命令?。一切似乎都按预期工作,只是代码对第一个参数之前的空行敏感。有没有办法摆脱这个问题,以便下面的 MWE 中漂亮和丑陋都可以工作?(我本来以为这个问题已经得到解答了,但搜索似乎没有找到它……)
\documentclass[10pt]{article}
\usepackage{pgfkeys}
\pgfkeys{ /mycmd/.is family, /mycmd,
default/.style = {cmdOpt = {}},
cmdOpt/.estore in = \mycmdOpt}
\newcommand\mycmd[1][]{%
\pgfkeys{/mycmd, default, #1}%
Hello \mycmdOpt World.
}
\begin{document}
\mycmd[cmdOpt = beautiful];
\mycmd[
cmdOpt = ugly];
\end{document}
编辑:
请注意,据我所知有两种解决方法:
\mycmd[%
cmdOpt = ugly];
和
\mycmd[,
cmdOpt = ugly];
我希望有某种东西不需要上述任何一个……
答案1
根据评论https://tex.stackexchange.com/users/3235/percusse,我尝试了以下方法,效果很好。请注意与我的原始代码相比的细微变化——逗号和 #1 之间没有空格。“,#1”而不是“, #1”。这样就行了。
\documentclass[10pt]{article}
\usepackage{pgfkeys}
\pgfkeys{ /mycmd/.is family, /mycmd,
default/.style = {cmdOpt = {}},
cmdOpt/.estore in = \mycmdOpt}
\newcommand\mycmd[1][]{%
\pgfkeys{/mycmd, default,#1}%
Hello \mycmdOpt World.
}
\begin{document}
\mycmd[cmdOpt = beautiful];
\mycmd[
cmdOpt = ugly];
\end{document}
答案2
如果您想要纯粹的键处理并且不将它们与 TikZ 一起使用,您可以考虑中的 keyval 函数expl3
:此代码会自动删除所有键名称开始和结尾的空格:
\documentclass[10pt]{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \mycmd { O { } }
{
\keys_set:nn { mycmd } { default , #1 }
Hello~\mycmdOpt\space World.
}
\keys_define:nn { mycmd }
{
default .meta:n = { cmdOpt = { } } ,
cmdOpt .tl_set:N = \mycmdOpt % You could use .tl_set_x:N ...
}
\ExplSyntaxOff
\begin{document}
\mycmd[cmdOpt = beautiful];
\mycmd[
cmdOpt = ugly];
\end{document}