\ifdefempty 的正确使用

\ifdefempty 的正确使用

我开发了一个路由来循环遍历外部生成的未知数据列表。当我尝试显示它时,我得到了不可预测的结果。这种不可预测性是因为我不熟悉 Latex 的相互作用。示例底部有三个输出语句。第一个可以正常工作,但输出格式无效。第二个导致结果始终显示“空”测试的错误结果。第三个不仅总是给出错误答案,而且还显示 26 个变量集,而显然只有 3 个变量集存在。我意识到我的方法可能是蛮力,但任何帮助使第三个命令正常工作的帮助都将不胜感激。

\documentclass [letterpaper, 12pt]{article}
\usepackage{etoolbox}
\begin{document}

\newcommand\EasAccBookA {B221}
\newcommand\EasAccBookB {}
\newcommand\EasAccBookC {B223}
\newcommand\EasAccPageA {P321}
\newcommand\EasAccPageB {}
\newcommand\EasAccPageC {P323}
\newcommand\EasAccInstA {}
\newcommand\EasAccInstB {I122}
\newcommand\EasAccInstC {}
\newcommand\Instrument {Instrument}

\newcounter{eaa}
\setcounter{eaa}{0}
\newcommand\LPEA {A}
\newcommand\ErEA [1] {EasAccBook#1}
\newcommand\ErEB [1] {EasAccPage#1}
\newcommand\ErEC [1] {EasAccInst#1}
\newcommand\ebookea {\csname\ErEA\LPEA\endcsname}
\newcommand\ebookeb {\csname\ErEB\LPEA\endcsname}
\newcommand\ebookec {\csname\ErEC\LPEA\endcsname} 
\renewcommand\theeaa{\Alph{eaa}}
\renewcommand\LPEA {\theeaa}
\loop
\ifnum\value{eaa}<26
\stepcounter{eaa}%

\ebookea \ebookeb \ebookec 
%\ifdefempty {\ebookea} {\ebookec} {\ebookea \, \ebookeb} 
%\ifdefempty {\ebookea} {\ebookec} {Book \ebookea, Page  \ebookeb}
\repeat
\end{document}

答案1

答案很简单:由于您正在加载,因此etoolbox您应该使用\csuse来调用您不知道它是否已定义的宏。您还可以使用测试\ifcsundef来检查命令是否已定义并\ifcsempty检查它是否有内容。问题是您的检查确实会查看是否\ebookea为空,但它绝不是空的,因为它被定义为\csname\ErEA\LPEA\endcsname。您的代码应该是这样的:

\documentclass [letterpaper, 12pt]{article}
\usepackage{etoolbox}
\begin{document}

\newcommand\EasAccBookA {B221}
\newcommand\EasAccBookB {}
\newcommand\EasAccBookC {B223}
\newcommand\EasAccPageA {P321}
\newcommand\EasAccPageB {}
\newcommand\EasAccPageC {P323}
\newcommand\EasAccInstA {}
\newcommand\EasAccInstB {I122}
\newcommand\EasAccInstC {}
\newcommand\Instrument {Instrument}

\newcounter{eaa}
\setcounter{eaa}{0}
\newcommand\LPEA {A}
\newcommand\ErEA [1] {EasAccBook#1}
\newcommand\ErEB [1] {EasAccPage#1}
\newcommand\ErEC [1] {EasAccInst#1}
\newcommand\ebookea {\csuse{\ErEA\LPEA}}
\newcommand\ebookeb {\csuse{\ErEB\LPEA}}
\newcommand\ebookec {\csuse{\ErEC\LPEA}} 
\renewcommand\theeaa{\Alph{eaa}}
\renewcommand\LPEA {\theeaa}
\loop
\ifnum\value{eaa}<26
\stepcounter{eaa}%

%\ebookea \ebookeb \ebookec 
%\ifcsundef{\ErEA\LPEA}{\ebookec}{Book \ebookea, Page \ebookeb}
%\ifdefempty {\ebookea} {\ebookec} {\ebookea \, \ebookeb} 
\ifcsundef{\ErEA\LPEA}
  {}% do nothing if undefined
  {\ifcsempty {\ErEA\LPEA} {\ebookec} {Book \ebookea, Page \ebookeb}}
\repeat
\end{document}

相关内容