我想根据许多可能的值检查可变变量,以便宏会根据该值表现出不同的行为。
由于变量很多,因此使用 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}