\phantom을 사용한 불완전한 \iffalse

\phantom을 사용한 불완전한 \iffalse

아래 코드를 디버깅하는 데 도움을 줄 수 있는 사람이 있나요? 작성된 대로 최종 반복의 행 \iffalse error에 불완전이 생성됩니다 . \xdef문제는 어떻게 든 \phantom매크로 와 관련이 있습니다 \def\c{0}. 정상적으로 작동합니다. 내부에 몇 가지 조건부 테스트가 있다는 것을 알고 있지만 \phantom무엇이 충돌하는지 파악하기에는 TeX 마법사가 충분하지 않습니다.

\documentclass{article}
\usepackage{tikz,xstring}

\begin{document}

\def\result{}
\foreach \i in {1,...,6}{
\StrChar{12345}{\i}[\c]
\ifx\c\empty
\def\c{\phantom{0}}
\fi
\xdef\result{\result\c}}


\stop

답변1

\phantom깨지기 쉬운 명령이며 에서 안전하지 않습니다 \edef. 로컬에서 안전하게 만드는 한 가지 방법은 다음과 같습니다.

\documentclass{article}
\usepackage{tikz,xstring}

\begin{document}

\def\result{}
\let\oldphantom\phantom
\let\phantom\relax
\foreach \i in {1,...,6}{
\StrChar{12345}{\i}[\c]
\ifx\c\empty
\def\c{\phantom{0}}
\fi
\xdef\result{\result\c}}
\let\phantom\oldphantom
\show\result

\stop

답변2

할당을 수행하기 때문에 \phantominside 를 가질 수 없습니다 .\xdef

문제를 피하기 위한 몇 가지 전략이 있습니다.

첫 번째 전략: \protected매크로를 사용하세요:

\documentclass{article}
\usepackage{xstring,pgffor}

\protected\def\Pzero{\phantom{0}}

\begin{document}

\def\result{}
\foreach \i in {1,...,6}{%
  \StrChar{12345}{\i}[\c]%
  \ifx\c\empty
    \def\c{\Pzero}%
  \fi
  \xdef\result{\result\c}%
}

X\result X

\end{document}

루프는 더 간단하게 다음과 같습니다.

\foreach \i in {1,...,6}{%
  \StrChar{12345}{\i}[\c]%
  \xdef\result{\result\ifx\c\empty\Pzero\else\c\fi}%
}

두 번째 전략: 토큰 레지스터를 사용합니다.

\documentclass{article}
\usepackage{xstring,pgffor}

\newtoks\mytoks

\begin{document}

\def\result{}
\mytoks={}
\foreach \i in {1,...,6}{%
  \StrChar{12345}{\i}[\c]%
  \ifx\c\empty
    \global\mytoks=\expandafter{\the\mytoks\phantom{0}}%
  \else
    \global\mytoks=\expandafter{\the\expandafter\mytoks\c}%
  \fi
}
\edef\result{\the\mytoks}

X\result X

\end{document}

세 번째 전략: 잊어 xstring버리고 pgffor선호하십시오 expl3.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\padnumber}{mmo}
 {% #1 is the final number of digits
  % #2 the given number
  % #3 is an optional macro to store the result in
  \IfNoValueTF{#3}
   {
    \jay_padnumber:nnn { \tl_use:N \l_jay_partial_tl } { #1 } { #2 }
   }
   {
    \jay_padnumber:nnn { \tl_set_eq:NN #3 \l_jay_partial_tl } { #1 } { #2 }
   }
 }

\tl_new:N \l_jay_partial_tl

\cs_new_protected:Npn \jay_padnumber:nnn #1 #2 #3
 {
  % store the given number
  \tl_set:Nn \l_jay_partial_tl { #3 }
  \int_compare:nT { \tl_count:N \l_jay_partial_tl < #2 }
   {
    % add as many \phantom{0} as needed
    \tl_put_right:Nx \l_jay_partial_tl
     {
      \prg_replicate:nn { #2 - \tl_count:N \l_jay_partial_tl } { \exp_not:N \phantom { 0 } }
     }
   }
  % produce the result or store it
  #1
 }
\ExplSyntaxOff

\begin{document}

X1234567890 % test

X\padnumber{6}{12345}X

X\padnumber{7}{12345}X

X\padnumber{4}{12345}X

\padnumber{8}{12345}[\result]

\texttt{\meaning\result}

\end{document}

인수의 항목 수를 계산합니다. 항목 수가 주어진 인수를 초과하면 해당 숫자가 단순히 인쇄(또는 저장)됩니다. 그렇지 않으면 한 단계에서 올바른 수가 \phantom{0}추가됩니다.

여기에 이미지 설명을 입력하세요

관련 정보