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>\fi
probará si la definición de <csA>
coincide con la de <csB>
y ejecutar <true>
, o <false>
de lo contrario:
\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
proporciona 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 \something
no es expandible porque incluye \def
asignació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 \detokenize
la primitiva expandible de eTeX, por ejemplo:
\if\penalty\detokenize{#1}\penalty the parameter empty.\else non-empty.\fi