我试图理解如何使用构造宏pgfkeys
并发现以下内容解决方案非常有用,但我想做点事情
我在下面做了一个非常小的例子。我想要的是有一个不接受值的键,但无论键是否存在都会发生一些事情。换句话说,我想要一种像下面注释掉的部分这样的语法。我认为这是可能的,因为tikz
我们可以创建,例如, node[draw, circle, fill=red]
。
那么我们如何创建不带任何值的键呢?
(我想即使我下面的例子也可以不用这样做ifthen
)
\documentclass{article}
\usepackage{ifthen}
\usepackage{pgfkeys}
\pgfkeys{
/display/.is family, /display,
show/.estore in = \myShow,
}
\newcommand\macroname[2][]{%
\pgfkeys{/display, #1}%
\ifthenelse{{\equal{\myShow}{once}}}{#2}
\ifthenelse{{\equal{\myShow}{twice}}}{#2#2}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\macroname[show=once]{input}
\macroname[show=twice]{input}
% \macroname[once]{input}
%
% \macroname[twice]{input}
\end{document}
B计划
根据 percusse 的评论,我再次尝试理解手册的 Key handler /.is if
。我让一些功能正常工作,但并非一切都如我所料。下面的 MWE 显示了宏的三个实例。为什么当有人使用键时,once
我仍然需要将其设置true
为才能使其工作?
\documentclass{article}
\usepackage{pgfkeys}
\newif\ifdisplayonce
\pgfkeys{/once/.is if=displayonce}
\pgfkeys{/once/.default=false}
\newcommand\macronameb[2][]{%
\pgfkeys{/once, #1}
\ifdisplayonce
#2
\else
#2#2
\fi
}
\begin{document}
\macronameb{input1}
\macronameb[once=true]{input2}
\macronameb[once]{input3}
\end{document}
答案1
有很多方法可以拥有不需要值的 pgfkeys(例如draw
,顺便说一下,该方法可以接受一个值draw=blue
:)。我并不真正理解你在做什么,但这里有几种使用没有值的键的不同方法,其中一些可能对你有用/有趣——它们都没有使用ifthenelse
。特别是,代码确实通过引入帮助宏来“解决”你的问题。\macrohelper
如果有更优雅的方法来做到这一点,我不会感到惊讶。
\documentclass{article}
\usepackage{ifthen}
\usepackage{pgfkeys}
\providecommand\macrohelper[1]{#1}% default set to "once"
\pgfkeys{
/display/.is family, /display,
unset/.initial=1,% can be used without setting
unsettling/.code={not set to #1},% can be used without setting
unsettling/.default=0,% default value
once/.code = {\renewcommand\macrohelper[1]{Once: ##1}},% redefine \helpermacro
twice/.code = {\renewcommand\macrohelper[1]{Twice: ##1+##1}},
show/.code = {\pgfkeys{/display/#1}}% calling shows defers to once/twice/error
}
\newcommand\macroname[2][]{%
\pgfkeys{/display, #1}%
\macrohelper{#2}
}
\begin{document}
\verb|\macroname[show=once]{input}| \macroname[show=once]{input}
\verb|\macroname[show=twice]{input}| \macroname[show=twice]{input}
\verb|\macroname[once]{input}| \macroname[once]{input}
\verb|\macroname[twice]{input}| \macroname[twice]{input}
\verb|\pgfkeys{/display/unset}| \pgfkeys{/display/unset}
\verb|\pgfkeys{/display/unset=2} \pgfkeys{/display/unset}| \pgfkeys{/display/unset=2} \pgfkeys{/display/unset}
\verb|\pgfkeys{/display/unsettling}| \pgfkeys{/display/unsettling}
\verb|\pgfkeys{/display/unsettling=2}| \pgfkeys{/display/unsettling=2}
\end{document}
当您通过 LaTeX 运行它时,会产生以下输出(“输入”在左侧\texttt
,输出在右侧):
另一个选项是使用键.is choice
的处理程序show
,以便为输入打印更有意义的错误消息,例如\macroname[show=thrice]{input}
。也就是说,你可以改用:
\pgfkeys{
/display/.is family, /display,
unset/.initial=1,
unsettling/.code={not set to #1},
once/.code = {\renewcommand\macrohelper[1]{Once: ##1}},
twice/.code = {\renewcommand\macrohelper[1]{Twice: ##1+##1}},
show/.is choice = {\pgfkeys{/display/#1}},
show/once/.code = {\pgfkeys{/display/once}},
show/twice/.code = {\pgfkeys{/display/twice}},
}
现在如果你尝试,show=thrice
你将收到错误消息:
!软件包 pgfkeys 错误:选择键“/display/show”中的选择“三次”未知。我将忽略此键。
最后,要使用.is if
处理程序,您必须首先定义一个布尔开关\newif
:
\documentclass{article}
\usepackage{pgfkeys}
\newif\ifshowonce\showoncefalse% twice by default
\providecommand\macrohelper[1]{#1}
\pgfkeys{
/display/.is family, /display,
show once/.is if=showonce
}
\newcommand\macrotwo[2][]{%
\pgfkeys{/display, #1}%
\ifshowonce #2\else #2+#2\fi
}
\begin{document}
\macrotwo{input}
\macrotwo[show once=true]{input}
\macrotwo[show once=false]{input}
\end{document}
生产: