pgfkeys 键无值

pgfkeys 键无值

我试图理解如何使用构造宏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}

生产:

在此处输入图片描述

相关内容