Preciso de ajuda para entender as instruções if.
Como faço o seguinte pseudocódigo em 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
}
De tal forma que quando um usuário adiciona o seguinte ao seu documento
\leader{
\begin{itemize}
\item this is an item
\item this is also an item
\end{itemize}
}
\donow
\leader{}
\donow
imprima o seguinte
*This is an item
*this is also an item
this is the false
Minha única pergunta sobre variáveis é: a solução que tenho é realmente a melhor maneira de criar variáveis?
Responder1
Você pode testar macro a macro usando \ifx
. Ou seja, \ifx<csA><csB><true>\else<false>\fi
testará se a definição de <csA>
corresponde à de <csB>
e execute <true>
, ou <false>
caso contrário:
\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
fornece mecanismo de verificação semelhante:
\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
Responder2
O código TeX padrão para determinada tarefa é:
\def\something#1{\def\internal{#1}%
\ifx\internal\empty the parameter is empty.\else it is nonempty.\fi
}
O problema deste código (acima) é que a macro \something
não é expansível porque inclui \def
atribuição. Se você precisar de uma macro expansível com o mesmo teste, precisará escolher o token nunca usado como o primeiro token no parâmetro (digamos, ?
em nosso exemplo) e poderá escrever:
\def\something#1{\ifx?#1?the parameter is empty.\else it is nonempty.\fi}
Se você não sabe qual token nunca ocorre como primeiro token do parâmetro, então você pode usar \detokenize
o primitivo expansível do eTeX, por exemplo:
\if\penalty\detokenize{#1}\penalty the parameter empty.\else non-empty.\fi