
コンテクスト
この質問は、答えこの質問の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
これらを堅牢にするためです。条件が空白かどうかを確認するものであると仮定すると、 from を\argseven
使用できます。\ifblank{#1}{true branch}{false branch}
etoolbox