我查看了 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}
根据您实际尝试做的事情,可能会有更多优雅的方法可用。