可扩展、非常具体的键值处理

可扩展、非常具体的键值处理

我很难想出一个完全可扩展的 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}

相关内容