将 pgfkey 变量与字符串进行比较

将 pgfkey 变量与字符串进行比较

我想根据许多可能的值检查可变变量,以便宏会根据该值表现出不同的行为。

由于变量很多,因此使用 pgfkeys 进行存储。使用 etoolbox 和大量括号对值进行测试,以使其更加“实用”。

使用 pgfkeys 和 etoolbox 的最小非工作示例:

\documentclass[12pt]{article}

\usepackage{etoolbox}
\usepackage{pgfkeys}

\begin{document}

\pgfkeys{/north/.default=a}

\pgfkeyssetvalue{/north}{h}

Current value of variable: \pgfkeysvalueof{/north}

\ifdefstring{\pgfkeysvalueof{/north}}{h}{Value is h}{Value is not h}

\end{document}

它不起作用(打印“值不是 h”)。我也无法使它与其他类似命令(如\ifstrequal\ifcsstrequal等)一起工作。

如何让它工作?

答案1

您可以先使用 检索密钥的值\pgfkeysgetvalue。以下代码会在宏中为您自动执行此操作:

\documentclass{article}

\usepackage{pgfkeys}
\usepackage{etoolbox}

\providerobustcmd*\mycmpvalue[1]
  {%
    \pgfkeysgetvalue{#1}\mytmp
    \ifdefstring\mytmp
  }

\pgfkeys{/north/.initial=a}

\begin{document}
\mycmpvalue{/north}{h}{true}{false}

\pgfkeyssetvalue{/north}{h}
\mycmpvalue{/north}{h}{true}{false}
\end{document}

在此处输入图片描述

小题大做:您很可能混淆了.default.initial(前者不会存储a在您的密钥中,但如果您省略了里面的值则会被使用\pgfkeys)。

但请注意,这仍然在内部使用宏来存储您的值(它们只是被一层隐藏了pgfkeys),而不是间接地简单地将您的值存储在宏中似乎并不复杂,但它会更快、更容易编写代码。与以下内容进行比较:


\documentclass{article}

\usepackage{etoolbox}

\newcommand*\mynorth{a}

\begin{document}
\ifdefstring\mynorth{h}{true}{false}

\renewcommand*\mynorth{h}
\ifdefstring\mynorth{h}{true}{false}
\end{document}

如果您仍然想使用key=value接口来设置您的值(这部分是可以理解的),您可以改用.store in处理程序(如果您想坚持使用)pgfkeys,或者使用不同的 key=value 接口(您的代码或多或少会独立于使用的 key=value 接口):

\documentclass{article}

\usepackage{etoolbox}
\usepackage{pgfkeys}

\pgfqkeys{/my}{north/.store in=\mynorth,north=a}

\begin{document}
\ifdefstring\mynorth{h}{true}{false}

\pgfkeys{/my/north=h}
\ifdefstring\mynorth{h}{true}{false}
\end{document}

或者相同expkv-def(我是作者,因此我选择那个作为示例,可以使用几乎任何其他 key=value 实现):

\documentclass{article}

\usepackage{etoolbox}
\usepackage{expkv-def}

\ekvdefinekeys{my}{store north=\mynorth,initial north=a}

\begin{document}
\ifdefstring\mynorth{h}{true}{false}

\ekvset{my}{north=h}
\ifdefstring\mynorth{h}{true}{false}
\end{document}

相关内容