Contexto

Contexto

Contexto

Esta pergunta é uma continuação dea respostadesta questãoEspaço espúrio no moderncv \cventry usando \if

Problema

O problema é que o conteúdo complexo (por exemplo, itemizeno conteúdo do argumento) não é bem tratado quando a condicional é definida como verdadeira.

Emulação

Para emular e mostrar o problema, criei o seguinte 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}

Quando alguém executa isso com \detailsfalseo código funciona. No entanto, \detailstruehá um erro:

! Sequência de controle indefinida. \itemize ...nce \@itemprofundidade \@ne \edef \@itemitem {labelitem\romannumeral \t...

Pergunta

Assim, qual a forma correta de lidar com o argumento, para que o seu \ifinterior possa ser avaliado, bem como o seu conteúdo complexo. (Como o problema da perguntaEspaço espúrio no moderncv \cventry usando \if)

Responder1

Admito que não entendo completamente o que você está tentando fazer aqui, mas, como observa egreg, \begine \itemsão frágeis, o que está causando o problema. É fácil "consertar" este exemplo específico

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

Não entendo qual é o objetivo dessa condicional (e removi os colchetes #1).

Como você está usando o \detokenize, você está contando com o e-TeX, então você pode usar

\usepackage{etoolbox}
\robustify\begin
\robustify\end
\robustify\item

para torná-los robustos. E supondo que a condicional seja verificar se \argsevenestá em branco, você pode usar \ifblank{#1}{true branch}{false branch}from etoolbox.

informação relacionada