Контекст

Контекст

Контекст

Этот вопрос является продолжениемответэтого вопросаЛожное пространство на moderncv \cventry с использованием \if

Проблема

Проблема в том, что сложное содержимое (например, itemizeсодержимое аргумента) не обрабатывается должным образом, если условное выражение установлено в значение «истина».

Эмуляция

Чтобы смоделировать и продемонстрировать проблему, я создал следующий 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}

При выполнении этого \detailsfalseкода он работает. Однако при \detailstrueвозникает ошибка:

! Неопределенная управляющая последовательность. \itemize ...nce \@itemdepth \@ne \edef \@itemitem {labelitem\romannumberal \t...

Вопрос

Итак, каков правильный способ рассмотрения аргумента, чтобы\if можно было оценить его внутреннюю часть, а также его сложное содержание. (Как проблема вопросаЛожное пространство на moderncv \cventry с использованием \if)

решение1

Признаю, что не совсем понимаю, что вы пытаетесь здесь сделать, но как отмечает egreg, \beginи \itemхрупкие, что и является причиной проблемы. Достаточно легко "исправить" этот конкретный пример

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

Я не понимаю, в чем смысл этого условного предложения (и я убрал скобки вокруг #1).

Поскольку вы используете \detokenize, вы полагаетесь на e-TeX, поэтому вы можете использовать

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

чтобы сделать их надежными. И предполагая, что условие заключается в проверке на \argsevenпустоту, вы можете использовать \ifblank{#1}{true branch}{false branch}from etoolbox.

Связанный контент