Если операторы и переменные

Если операторы и переменные

Мне нужна помощь в понимании операторов 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

Связанный контент