
情境
這個問題是後續問題答案這個問題的Moderncv \cventry 上使用 \if 的雜訊空間
問題
問題在於,當條件設定為 true 時,複雜的內容(例如,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\romannumeral \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
。