使用以下
\def \ifempty#1{\def\temp{#1} \ifx\temp\empty }
\def \mymacro#1{ \ifempty{#1} empty \else not empty \fi }
\mymacro{something} % prints "not empty"
\mymacro{} % prints "empty"
这一切都有效,直到我介绍\newcommand{\somename}{John}
:
\newcommand{\somename}{John}
\def \ifempty#1{\def\temp{#1} \ifx\temp\empty }
\def \mymacro#1{ \ifempty{#1} empty \else not empty \fi }
\mymacro{\somename{}} % prints "not empty"
这是正确的。但是当我更改\newcommand{\somename}{John}
为,\newcommand{\somename}{}
所以\somename{}
是空白时。\mymacro
仍然认为有一个字符串并打印“不为空”,而实际上\somename{}
是空的。
问:我怎样才能使它\mymacro{\someone{}}
正常工作\newcommand{\somename}{}
,即\newcommand{\somename}{John}
如果\somename{}
包含字符串\mymacro
则打印“非空”,如果\somename{}
不包含字符串则打印“空”
答案1
\ifx
比较两个宏的第一级展开,以及它们相对于的状态\long
。
如果你这样做\def\temp{\somename{}}
,替换文本肯定不为空。即使你这样做\edef\temp{\somename{}}
(用空的替换文本替换\somename
),你也不会得到空的结果,因为括号仍然在那里。
请注意,您\somename{}
需要打印替换文本\somename
并保留其后的空格。括号不会被删除,但{}
在排版时不会执行任何操作。
一种不同的方法:
\documentclass{article}
\usepackage{pdftexcmds}
\makeatletter
\newcommand{\ifempty}[1]{\ifnum\pdf@strcmp{#1}{}=\z@}
\makeatother
\newcommand{\mymacro}[1]{\ifempty{#1}empty\else not empty\fi}
\newcommand{\somename}{John}
\newcommand{\someothername}{}
\begin{document}
\mymacro{something}
\mymacro{}
\mymacro{\somename}
\mymacro{\someothername}
\end{document}
这将打印
非空
空
非
空 空