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

相关内容