if文と変数

if文と変数

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}

パラメータの最初のトークンとして決して出現しないトークンがわからない場合は、\detokenizeeTeX の展開可能なプリミティブを使用できます。たとえば、次のようになります。

\if\penalty\detokenize{#1}\penalty the parameter empty.\else non-empty.\fi

関連情報