语境

语境

语境

这个问题是答案这个问题使用 \if 时,moderncv \cventry 中出现虚假空格

问题

问题在于,当条件设置为真时,复杂的内容(例如,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能够评估其内部,以及其上的复杂内容呢?(就像问题的问题一样使用 \if 时,moderncv \cventry 中出现虚假空格

答案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

相关内容