如何从 xkeyval 包中编码 \key@ifundefined?

如何从 xkeyval 包中编码 \key@ifundefined?

我查看了 xkeyval 包文档并尽力遵循它。但是,我无法获得\key@ifundefined 可以编译和运行的代码。

这是我的 MWE,其中有问题的行被注释掉了。

现有的行为是,对于调用参数中未定义的键,我在列表中嵌入了空白行。

所需的功能是跳过打印这些空值,并且打印时不留空行。我认为这\key@ifundefined 可以帮助我实现这一点...

% !TeX root = mwe.tex
\documentclass[12pt,a4paper,titlepage,english]{article}


\usepackage{xkeyval}


%% Start definitions using KEYS
\makeatletter
\define@key{ingredientlanguage}{englishname}[]{\gdef\Zenglishname{#1}}
\define@key{ingredientlanguage}{thainame}[]{\gdef\Zthainame{#1}}
\define@key{ingredientlanguage}{burmesename}[]{\gdef\Zburmesename{#1}}
\define@key{ingredientlanguage}{khmername}[]{\gdef\Zkhmername{#1}}

\makeatother
%%  End Definitions using KEYS


\newcommand{\myAddIngredient}[1]{%
    \begingroup

    \setkeys{ingredientlanguage}{#1}

    %   \key@ifundefined{ingredientlanguage}{burmesename}{undefined}{defined}

%   
%   {\Zenglishname}\\
%   \key@ifundefined{ingredientlanguage}{burmesename}{}{{\Zburmesename}\\}
%   {\Zthainame}\\
%   {\Zkhmername}\\


         {\Zenglishname}\\
         {\Zburmesename}\\
         {\Zthainame}\\
         {\Zkhmername}\\




    \endgroup
}


\newcommand{\zixxFone}{

    \myAddIngredient{
        englishname=Star Fruit,
        thainame=mafeung,
        khmername,
        burmesename=qwerty}

}




\newcommand{\zixxFtwo}{

    \myAddIngredient{
        englishname=Star Fruit,
        thainame=mafeung,
        khmername,
        burmesename=}

}




\begin{document}

\zixxFone

\rule{\textwidth}{3pt}


\zixxFtwo


\end{document}

答案1

如果我理解xkeyval正确,文档\key@ifundefined仅检查您是否已使用 给出了键定义\define@key。因此\key@ifundefined对于 始终为 false,{ingredientlanguage}{burmesename}因为您已在 中给出了该键的定义\define@key{ingredientlanguage}{burmesename}[]{\gdef\Zburmesename{#1}}\key@ifundefined可能不是您要找的。

为了获得所需的结果,您应该测试写入数据的宏是否为空。这可以使用etoolbox's来完成\ifdefvoid,例如

\ifdefvoid\Zburmesename
  {<\Zburmesename is empty>}
  {<\Zburmesename is not empty>}

可能将按如下方式使用。(请注意,我将全局赋值更改为\gdef局部赋值\def。当没有给出键时,这应该可以避免奇怪的副作用。至少在示例中,您不需要全局赋值 - 如果您想要一个可重复使用的\setkeys宏,您可能应该以避免全局赋值的方式对其进行编码。)

\documentclass[12pt,a4paper]{article}

\usepackage{etoolbox}
\usepackage{xkeyval}
\makeatletter
\define@key{ingredientlanguage}{englishname}[]{\def\Zenglishname{#1}}
\define@key{ingredientlanguage}{thainame}[]{\def\Zthainame{#1}}
\define@key{ingredientlanguage}{burmesename}[]{\def\Zburmesename{#1}}
\define@key{ingredientlanguage}{khmername}[]{\def\Zkhmername{#1}}
\makeatother

\newcommand{\myAddIngredient}[1]{%
    \begingroup
    \setkeys{ingredientlanguage}{#1}%
      \Zenglishname\\
      \ifdefvoid\Zburmesename
        {}
        {\Zburmesename\\}%
      \Zthainame\\
      \ifdefvoid\Zkhmername
        {}
        {\Zkhmername\\}%
    \endgroup
}
\makeatother


\newcommand{\zixxFone}{%
  \myAddIngredient{
    englishname=Star Fruit,
    thainame=mafeung,
    khmername,
    burmesename=qwerty}%
}

\newcommand{\zixxFtwo}{%
  \myAddIngredient{
    englishname=Star Fruit,
    thainame=mafeung,
    khmername=,
  }%
}


\begin{document}
\zixxFone
\rule{\textwidth}{3pt}
\zixxFtwo
\end{document}

杨桃//qwerty//mafeung -- 杨桃//mafeung

根据您实际尝试做的事情,可能会有更多优雅的方法可用。

相关内容