
私はハーバートの答えをマクロ引数が空かどうか確認する引数が空かどうかをチェックします。Herbert のソリューションを拡張して、マクロ引数が であるかどうかも検出できるかどうか疑問に思っていました\empty
。これができない場合は、 でマクロを設定して、\ifempty
希望どおりに動作させる方法を学習したいと考えていました。次のコードは、 が\ifempty
空のマクロ引数を正しく検出するが、 を空の引数とは見なさないことを示しています\empty
。次に、空のマクロを定義するための失敗した試みをいくつか示します。
\documentclass{article}
\makeatletter
\def\ifempty#1{%
\if\relax\detokenize{#1}\relax%
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\makeatother
\begin{document}
\ifempty{}{1. empty}{1. nonempty}
\ifempty{\empty}{2. empty}{2. nonempty}
\def\z%
\ifempty{\z}{3. empty}{3. nonempty}
\def\z{}%
\ifempty{\z}{4. empty}{4. nonempty}
\end{document}
答え1
\empty
もちろん、Detokenized は空ではありません。4 つの例に対する短いコメント。
予想通りです。
冒頭で述べたように空ではありません。
を定義しています
\z
が、その後に文字列 が続く必要があります% \ifempty
。定義は誤りですが、使用されることはありません。次に があり{3. empty}{3. nonempty}
、通常のテキストとして記述されます。今は
\z
適切に定義されていますが、z
もちろん空ではありません。
マクロの同等性を単純に比較したい場合は、\ifx
の方が適しているかもしれません。