
Контекст
Этот вопрос является продолжениемответэтого вопросаЛожное пространство на 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
.