
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 itemize
der 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 \detailsfalse
funktioniert der Code. Allerdings \detailstrue
kommt 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 \if
Innere 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 \begin
und \item
zerbrechlich, 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 \argseven
leer ist, können Sie \ifblank{#1}{true branch}{false branch}
from verwenden etoolbox
.