
문자열을 개별 문자로 분할하고 각 문자를 개별적으로 변환한 다음 다시 결합하고 싶습니다.
이 같은:
\newcommand{\drawaboxaroundit}[1]{...}
\newcommand{\glue}{+}
\explodethenjoin{abcdef}{\drawaboxaroundit}{\glue}
작동 방식을 간략히 설명하면 \drawaboxaroundit
(단지 설명을 위한 것일 뿐이며 실제로 수행하는 작업은 아닙니다) 이 예제의 결과는 다음과 같습니다.
의도는 다음과 \explodethenjoin{abc}{\drawaboxaroundit}{\glue}
같이 확장하는 것 입니다.
\drawaboxaroundit{a}\glue\drawaboxaroundit{b}\glue\drawaboxaroundit{c}
나는 내 문제에 대한 해결책을 거의 가지고 있습니다.이 답변(기본적으로 expl에 대해 아무것도 모르기 때문에 작동 방식을 이해하지 못하지만) - 이것은 각 문자를 개별적으로 처리하지만 문자 사이에 접착제를 넣지 않습니다.
한 가지 접근 방식(나에게는 좋은 디자인이 아닌 것 같습니다)은 \drawaboxaroundit
해당 위치를 인식하는 것입니다. 즉 위의 abc
예는 다음과 같이 확장됩니다.
\drawaboxarounditwrapper{0}{\glue}{a}\drawaboxarounditwrapper{1}{\glue}{b}\drawaboxarounditwrapper{2}{\glue}{c}
다음 과 \drawaboxarounditwrapper
같이 정의되어 있습니다.
\newcommand{\drawaboxarounditwrapper}[2]{
\ifthenelse{\equal{#1}{0}}{}{\glue}
\drawaboxaroundit{#2}
}
또 다른 옵션은 문자열을 머리 문자와 꼬리 문자열로 분할하는 것입니다. 이 같은
\witheachcharacterinheadandtail{abcdef}{\drawaboxaroundit}{\glue\drawaboxaroundit}
어디까지 \witheachcharacterinheadandtail{abcdef}{\foo}{\bar}
확장되는가
\foo{a}\bar{b}\bar{c}\bar{d}\bar{e}\bar{f}
이 두 번째 접근 방식이 더 나은 것 같지만 이러한 접근 방식 중 하나를 실현하는 방법이나 우선 둘 중 하나가 좋은 아이디어인지는 모르겠습니다.
문자열을 폭발-변형-결합하려면 어떻게 해야 합니까?문제의 문자열은 ASCII이고 라텍스 명령이 포함되어 있지 않으며 모든 문자열에는 최소한 두 개의 문자가 포함되어 있다고 가정할 수 있습니다(꼬리 길이는 항상 0이 아님).
답변1
\documentclass{article}
\def\xloop#1{\ifx\relax#1\else\xloopbody{#1}\expandafter\xloop\fi}
\newcommand\explodethenjoin[3]%
{\def\inter{\def\inter{#3}}%
\def\xloopbody##1{\inter#2{##1}}%
\xloop#1\relax
}
\begin{document}
\explodethenjoin{abcdef}{\fbox}{+}
\end{document}
매크로는 를 \xloop
만날 때까지 뒤에 오는 토큰을 반복합니다 \relax
. 사용되었습니다이 사이트에서 여러 번. 각 토큰에 대해 매크로가 \xloopbody
실행됩니다. 적절하게 정의하면 필요에 따라 토큰을 처리할 수 있습니다.
답변2
TeX에는 실제로 문자열이 없으므로 토큰 목록을 분할하기 위해 특정 명령이 필요하지 않으며 이미 고유한 토큰 목록입니다. 마찬가지로 토큰 목록을 반복하는 것은 일반적인 tex 동작이므로 명시적인 루프 매크로를 사용할 필요가 없습니다.
\documentclass{article}
\def\zz#1{\def\zzsep{}\zzz#1\relax}
\def\zzz#1{\ifx\relax#1\else\zzsep\def\zzsep{+}\fbox{#1}\expandafter\zzz\fi}
\begin{document}
\zz{abcdef}
\end{document}
답변3
다음을 사용하면 매우 쉽습니다 xparse
.
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\splitstring}{mmO{}}
{
\spraff_string_split:nnn { #1 } { #2 } { #3 }
}
\seq_new:N \l_spraff_string_in_seq
\seq_new:N \l_spraff_string_out_seq
\cs_new_protected:Nn \spraff_string_split:nnn
{
% split the string at 'nothing'
\seq_set_split:Nnn \l_spraff_string_in_seq { } { #1 }
% change each item into '#2{<item>}'
\seq_set_map:NNn \l_spraff_string_out_seq \l_spraff_string_in_seq { #2 { ##1 } }
% use the sequence with '#3' in between items
\seq_use:Nn \l_spraff_string_out_seq { #3 }
}
\ExplSyntaxOff
\NewDocumentCommand{\boxit}{m}{\fbox{\strut#1}}
\begin{document}
\splitstring{abcdef}{\boxit}
\splitstring{abcdef}{\boxit}[${}+{}$]
\end{document}
의 두 번째 인수로 사용되는 매크로는 로 \splitstring
정의되어야 합니다 \NewDocumentCommand
.