if/else 测试字符串是否为空失败

if/else 测试字符串是否为空失败

使用以下

\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}

这将打印

非空


空 空

相关内容