아래 코드를 디버깅하는 데 도움을 줄 수 있는 사람이 있나요? 작성된 대로 최종 반복의 행 \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
할당을 수행하기 때문에 \phantom
inside 를 가질 수 없습니다 .\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}
추가됩니다.