Si declaraciones y variables

Si declaraciones y variables

Necesito ayuda para entender las declaraciones if.

¿Cómo hago el siguiente pseudocódigo en 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 modo que cuando un usuario agrega lo siguiente a su documento

\leader{
    \begin{itemize}
        \item this is an item
        \item this is also an item
    \end{itemize}
}

\donow

\leader{}

\donow

imprime lo siguiente

*This is an item

*this is also an item

this is the false

Mi única pregunta sobre las variables es: ¿la solución que tengo es realmente la mejor manera de crear variables?

Respuesta1

Puedes probar macro a macro usando \ifx. Es decir, \ifx<csA><csB><true>\else<false>\fiprobará si la definición de <csA>coincide con la de <csB>y ejecutar <true>, o <false>de lo contrario:

ingrese la descripción de la imagen aquí

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

etoolboxproporciona un mecanismo de verificación similar:

\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

Respuesta2

El código TeX estándar para una tarea determinada es:

\def\something#1{\def\internal{#1}%
   \ifx\internal\empty the parameter is empty.\else it is nonempty.\fi
}

El problema de este código (arriba) es que la macro \somethingno es expandible porque incluye \defasignación. Si necesita una macro expandible con la misma prueba, entonces debe elegir el token que nunca se usó como primer token en el parámetro (por ejemplo, ?en nuestro ejemplo) y puede escribir:

\def\something#1{\ifx?#1?the parameter is empty.\else it is nonempty.\fi}

Si no sabe qué token nunca aparece como primer token del parámetro, puede usar \detokenizela primitiva expandible de eTeX, por ejemplo:

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

información relacionada