if 文を理解するのに助けが必要です。
次の疑似コードを LaTeX で作成するにはどうすればよいですか。
\newcommand{\@leader}{}
\newcommand{\leader}[1]{\renewcommand\@leader{#1}}
\newcommand{\donow}{
\if \@leader == {} %aka blank, null, empty
this is the false %do false
\else
\@leader %do leader
\fi
}
ユーザーがドキュメントに次の内容を追加すると、
\leader{
\begin{itemize}
\item this is an item
\item this is also an item
\end{itemize}
}
\donow
\leader{}
\donow
以下を印刷する
*This is an item
*this is also an item
this is the false
変数に関する私の唯一の疑問は、私が持っている解決策が本当に変数を作成するための最良の方法なのかということです。
答え1
を使用してマクロ間のテストを行うことができます\ifx
。つまり、は の定義が の定義と一致するか\ifx<csA><csB><true>\else<false>\fi
どうかをテストし、 を実行します。一致しない場合は、 を実行します。<csA>
<csB>
<true>
<false>
\documentclass{article}
\makeatletter
\newcommand{\@emptymacro}{}% Used to test against an empty macro
\newcommand{\@something}{}
\newcommand{\something}[1]{\renewcommand\@something{#1}}
\newcommand{\donow}{%
\ifx\@something\@emptymacro %aka blank, null, empty
this is the false %do false
\else
\@something %do something
\fi
}
\makeatother
\begin{document}
\something{%
\begin{itemize}
\item this is an item
\item this is also an item
\end{itemize}
}
\donow
\something{}
\donow
\end{document}
etoolbox
同様のチェックメカニズムを提供します:
\usepackage{etoolbox}
\makeatletter
\newcommand{\@something}{}
\newcommand{\something}[1]{\renewcommand\@something{#1}}
\newcommand{\donow}{%
\ifdefempty{\@something}{%aka blank, null, empty
this is the false %do false
}{%
\@something %do something
}%
}
\makeatother
答え2
与えられたタスクの標準 TeX コードは次のとおりです。
\def\something#1{\def\internal{#1}%
\ifx\internal\empty the parameter is empty.\else it is nonempty.\fi
}
このコード (上記) の問題は、代入\something
が含まれているためマクロが展開できないことです\def
。同じテストで展開可能なマクロが必要な場合は、パラメータの最初のトークンとして一度も使用されていないトークンを選択する必要があります (?
この例では)。次のように記述できます。
\def\something#1{\ifx?#1?the parameter is empty.\else it is nonempty.\fi}
パラメータの最初のトークンとして決して出現しないトークンがわからない場合は、\detokenize
eTeX の展開可能なプリミティブを使用できます。たとえば、次のようになります。
\if\penalty\detokenize{#1}\penalty the parameter empty.\else non-empty.\fi