문맥

문맥

문맥

이 질문은 다음 질문에 대한 후속 질문입니다.대답이 질문의\if를 사용하는 moderncv \cventry의 가짜 공간

문제

문제는 조건이 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 \@itemlength \@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).

을 사용하고 있으므로 \detokenizee-TeX에 의존하고 있으므로 다음을 사용할 수 있습니다.

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

그것들을 견고하게 만들기 위해. 조건이 비어 있는지 확인하는 것이라고 가정하면 from 을 \argseven사용할 수 있습니다 .\ifblank{#1}{true branch}{false branch}etoolbox

관련 정보