我很难想出一个完全可扩展的 keyval 解析宏,它只处理特定的键/值。我甚至不会尝试完全通用地做到这一点,这远远超出了我的能力范围。这是我目前所能做到的:
\documentclass{article}
\usepackage{etoolbox}
\usepackage{ifthen}
\begin{document}
\makeatletter
\def\foo@bar{value}
\def\thing@i#1{%
\thing@ii#1&}
\def\thing@ii#1=#2&{%
\ifthenelse{\equal{#1}{form}}
{#2}
{}}
\catcode`\==11
\csuse{foo@\thing@i{form=original}}
\end{document}
除了必须对“=”进行 catcode 的问题(然后当“=”不再表示“=”时,必须以某种方式稍后再次对其进行 catcode)之外,这\ifthen
似乎由于某些扩展问题而不起作用。我现在看到这个有点麻木,我试过使用\ifx
等,但没有运气。似乎没有办法获得完全可扩展的 keyval 处理,所以我只能做一些对可能的键进行硬编码的事情等。我必须这样做,因为我将拥有带有 keyval 参数的宏,这些宏需要完全扩展才能构造 csnames。
答案1
这些\ifthenelse
测试不可扩展。你可以使用\pdfstrcmp
它来进行比较(而且\pdf@strcmp
更好,因为它独立于引擎):
\documentclass{article}
\usepackage{etoolbox,pdftexcmds}
\begin{document}
\makeatletter
\def\foo@bar{value}
\def\thing@i#1{%
\thing@ii#1&}
\def\thing@ii#1=#2&{%
\ifnum\pdf@strcmp{#1}{form}=\z@
#2%
\fi}
\def\foo@original{ORIGINAL} % provide a definition for testing
\csuse{foo@\thing@i{form=original}}
\end{document}
您还可以去掉空格(但请注意,这也会去掉“内部空格”,因此名称中没有带空格的选项):
\documentclass{article}
\usepackage{etoolbox,pdftexcmds}
\begin{document}
\makeatletter
\def\foo@bar{value}
\def\thing@i#1{%
\thing@ii#1&}
\def\thing@ii#1=#2&{%
\ifnum\pdf@strcmp{\zap@space#1 \@empty}{form}=\z@
\zap@space#2 \@empty
\fi}
\def\foo@original{ORIGINAL} % provide a definition for testing
\csuse{foo@\thing@i{form=original}}
\csuse{foo@\thing@i{form =original}}
\csuse{foo@\thing@i{form = original}}
\csuse{foo@\thing@i{ form = original }}
\end{document}