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