
Contexto
Esta pregunta es una continuación dela respuestade esta preguntaEspacio espurio en moderncv \cventry usando \if
Problema
El problema es que el contenido complejo (por ejemplo, itemize
el contenido del argumento) no se maneja bien cuando el condicional se establece en verdadero.
Emulación
Para emular y mostrar el problema, creé el siguiente MWE
\documentclass{article}
\newif\ifdetails
\detailstrue
%\detailsfalse
\makeatletter
\newcommand{\test}[1]{-#1-}
\newcommand{\wrapper}[1]{%
\test{%
\begingroup
\protected@edef\x{\endgroup
\noexpand\long\noexpand\def\noexpand\argseven{#1}}\x
\if\relax\detokenize\expandafter{\romannumeral-`\Q\argseven}\relax
\else{#1}\fi}}
\makeatother
\begin{document}
\wrapper{%
\ifdetails
I would like all this stuff to be raggedright, however. The "year-year" is not important.
\fi
}
\wrapper{%
\ifdetails
I would like all this stuff to be raggedright, however.
% This more complex content breaks existing solutions
\begin{itemize}
\item Item 1
\item Item 2
\end{itemize}
\fi%
}
\end{document}
Cuando uno ejecuta eso con \detailsfalse
el código funciona. Sin embargo, \detailstrue
hay un error:
! Secuencia de control Indefinido. \itemize ...nce \@item Depth \@ne \edef \@itemitem {labelitem\romannumeral \t...
Pregunta
Entonces, ¿cuál es la forma correcta de manejar el argumento, para que \if
se pueda evaluar el interior, así como el contenido complejo del mismo? (Como el problema de la preguntaEspacio espurio en moderncv \cventry usando \if)
Respuesta1
Admito que no entiendo completamente lo que estás tratando de hacer aquí, pero como señala egreg, son frágiles \begin
y \item
eso es lo que está causando el problema. Es bastante fácil "arreglar" este ejemplo en particular.
\newcommand{\wrapper}[1]{%
\test{%
\begingroup
\let\begin\relax
\let\item\relax
\let\end\relax
\protected@edef\x{%
\endgroup
\noexpand\long\noexpand\def\noexpand\argseven{#1}%
}%
\x
\if\relax\detokenize\expandafter{\romannumeral-`\Q\argseven}\relax\else
#1%
\fi
}%
}
No entiendo cuál es el punto de ese condicional (y eliminé las llaves alrededor #1
).
Como estás usando \detokenize
, estás confiando en e-TeX, por lo que puedes usar
\usepackage{etoolbox}
\robustify\begin
\robustify\end
\robustify\item
para hacerlos robustos. Y asumiendo que el condicional es para verificar si \argseven
está en blanco, puedes usar \ifblank{#1}{true branch}{false branch}
from etoolbox
.