Contexto

Contexto

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, itemizeel 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 \detailsfalseel código funciona. Sin embargo, \detailstruehay 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 \ifse 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 \beginy \itemeso 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 \argsevenestá en blanco, puedes usar \ifblank{#1}{true branch}{false branch}from etoolbox.

información relacionada