Kontext

Kontext

Kontext

Diese Frage ist eine Folgefrage vondie Antwortdieser FrageUnzulässiger Speicherplatz auf moderncv \cventry mit \if

Problem

Das Problem besteht darin, dass komplexe Inhalte (beispielsweise itemizeder Inhalt des Arguments) nicht gut verarbeitet werden, wenn die Bedingung auf „true“ gesetzt ist.

Emulation

Um das Problem zu emulieren und zu zeigen, habe ich das folgende MWE erstellt

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

Wenn man das mit ausführt \detailsfalsefunktioniert der Code. Allerdings \detailstruekommt bei ein Fehler:

! Undefinierte Steuersequenz. \itemize ...nce \@itemdepth \@ne \edef \@itemitem {labelitem\romannumeral \t...

Frage

Wie also ist die richtige Art und Weise, mit dem Argument umzugehen, damit sowohl das \ifInnere als auch der komplexe Inhalt bewertet werden können. (Wie das Problem der FrageUnzulässiger Speicherplatz auf moderncv \cventry mit \if)

Antwort1

Ich gebe zu, dass ich nicht ganz verstehe, was Sie hier versuchen, aber wie egreg bemerkt, sind \beginund \itemzerbrechlich, was das Problem verursacht. Es ist leicht genug, dieses spezielle Beispiel zu „reparieren“

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

Ich verstehe den Sinn dieses Bedingungssatzes nicht (und ich habe die Klammern um #1) entfernt.

Da Sie verwenden \detokenize, verlassen Sie sich auf e-TeX, Sie können also verwenden

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

um diese robust zu machen. Und vorausgesetzt, dass die Bedingung darin besteht, zu prüfen, ob \argsevenleer ist, können Sie \ifblank{#1}{true branch}{false branch}from verwenden etoolbox.

verwandte Informationen