Se instruções e variáveis

Se instruções e variáveis

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>\fitestará se a definição de <csA>corresponde à de <csB>e execute <true>, ou <false>caso contrário:

insira a descrição da imagem aqui

\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}

etoolboxfornece 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 \somethingnão é expansível porque inclui \defatribuiçã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 \detokenizeo primitivo expansível do eTeX, por exemplo:

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

informação relacionada