문자열을 문자 단위로 분할하고 서식을 사용하여 병합

문자열을 문자 단위로 분할하고 서식을 사용하여 병합

매크로를 어떻게 만들 수 있나요?

\split{ABC}

출력하는

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

문자의 서식이 다른 매크로를 사용하여 만들어지는 경우, 즉

\formatchar{A}

어디

\def\formatchar#1{{\color{red}#1}}

어떤 문자열 길이에 대해?

코드를 수정하려고했습니다. 문자열 n을 n으로 분할

\documentclass{article}
\usepackage{xstring}

\def\split#1#2{%
    \StrSplit{#2}{1}\tempa\tempb
    x%
    \tempa\let\tempa\empty
    \unless\ifx\tempb\empty\def\tempa{|\split{1}\tempb}\fi
    y%
    \tempa
}

\begin{document}
\split{1}{ABCD}
\end{document}

그리고 (명령과 }로 제한에 실패했기 때문에) 전후에 x와 y를 얻었지만 제대로 포맷할 수 없습니다. 또한 통화 중 {1}을(를) 피하고 싶습니다.

\split{ABCD}

오직. 항상 1자로 분할됩니다.

어떤 도움이라도 대단히 감사하겠습니다!

답변1

입력이 "ASCII 전용"으로 보장되지 않으면 접근 방식이 \seq_set_split:Nnn작동하지 않을 수 있습니다.

가 차지하기 \splitchars때문에 이름을 으로 변경했습니다 .\splitamsmath

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xcolor}

\NewDocumentCommand{\formatchar}{m}{%
  \textcolor{red!90!yellow}{#1}% <--- or whatever you like
}

\ExplSyntaxOn

\NewDocumentCommand{\splitchars}{O{|}m}
 {% #1 = optional separator, default |
  % #2 = text to split
  \mflxvii_split:nn { #1 } { #2 }
 }

\seq_new:N \l__mflxvii_split_items_seq

\cs_new_protected:Nn \mflxvii_split:nn
 {
  \seq_clear:N \l__mflxvii_split_items_seq
  \text_map_inline:nn { #2 }
   {
    \seq_put_right:Nn \l__mflxvii_split_items_seq { \formatchar{##1} }
   }
  \seq_use:Nn \l__mflxvii_split_items_seq { #1 }
 }

\ExplSyntaxOff

\begin{document}

\splitchars{ABC}

\splitchars[--]{ABC}

\splitchars{ábç}

\splitchars{ÅÄÖ}

\end{document}

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

목록과 같은 출력을 얻기 위해 마지막 두 항목 사이에 다른 구분 기호를 허용하는 확장이 있습니다.

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xcolor}

\NewDocumentCommand{\formatchar}{m}{%
  \textcolor{red!90!yellow}{#1}% <--- or whatever you like
}

\ExplSyntaxOn

\NewDocumentCommand{\splitchars}{O{|}O{#1}m}
 {% #1 = optional separator, default |
  % #2 = optional separator between last two
  % #3 = text to split
  \mflxvii_split:nnn { #1 } { #2 } { #3 }
 }

\seq_new:N \l__mflxvii_split_items_seq

\cs_new_protected:Nn \mflxvii_split:nnn
 {
  \seq_clear:N \l__mflxvii_split_items_seq
  \text_map_inline:nn { #3 }
   {
    \seq_put_right:Nn \l__mflxvii_split_items_seq { \formatchar{##1} }
   }
  \seq_use:Nnnn \l__mflxvii_split_items_seq { #2 } { #1 } { #2 }
 }

\ExplSyntaxOff

\begin{document}

\splitchars{ABC}

\splitchars[--]{ABC}

\splitchars{ábç}

\splitchars{ÅÄÖ}

\splitchars[, ][ and ]{ÅÄÖ}

\splitchars[, ][ and ]{ÅÄ}

\end{document}

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

답변2

gsub다음은 Lua 와 sub내장 기능을 활용하는 LuaLaTeX 기반 솔루션입니다 . 실제로 코드는 utf8로 인코딩된 문자를 직접 처리할 수 있는 gsub및 함수 버전을 사용합니다.sub

기본 사용자 수준 매크로는 \splitstring대신 호출됩니다 \split.엄청난패키지는 및 split라는 매크로와 함께 호출되는 환경을 정의합니다 .\split\endsplit

(a) 인수에 \splitstring공백이 포함될 수 있고 (b) formatcharLaTeX 매크로가 아닌 Lua 함수로 구현된다는 점에 유의하세요.

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

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{xcolor}  % for '\textcolor' macro

% Lua-side code
\directlua{
  function formatchar ( c )
     return ( '\\textcolor{red}{\\textbf{' .. c .. '}}|' )
  end
  function split ( s )
     s = unicode.utf8.gsub ( s , '.' , formatchar )
     return ( unicode.utf8.sub ( s , 1 , -2 ) ) % delete final '|'
  end
}
% LaTeX-side code
\newcommand\splitstring[1]{\directlua{tex.sprint(split('#1'))}}

\begin{document}
\obeylines % just for this example
\splitstring{ABC}
\splitstring{123abc}
\splitstring{Hello World}
\end{document}

답변3

ExplSyntax를 사용한 솔루션 시도는 다음과 같습니다.

\documentclass{article}
\usepackage{xcolor}

\ExplSyntaxOn
\seq_new:N \l__my_split_seq
\NewDocumentCommand { \split } { m } {  \__my_split:n { #1 }  }
\cs_new_protected:Npn \__my_split:n #1
{
  \seq_set_split:Nnn \l__my_split_seq {} { #1 }
  \seq_set_map:NNn \l__my_split_seq \l__my_split_seq
  {  \__my_split_fn:n { ##1 }  }
  % \seq_log:N \l__my_split_seq
  \seq_use:Nn \l__my_split_seq { | }
}
\cs_new_protected:Npn \__my_split_fn:n #1 {   {  \color { red } #1  }   }
\ExplSyntaxOff

\begin{document}

\split{ABCD}

\split{1234}

\end{document}

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

답변4

LaTeX2e 솔루션은 제공되지 않으므로 여기에 하나 제공합니다. 저는 토큰 사이클을 사용하여 인수에서 문자를 하나씩 가져옵니다. 이 솔루션에서는 인수에 매크로나 그룹이 없다고 가정합니다. 필요에 따라 처리할 수는 있지만 처리 방법에 대한 지침이 제공되지 않았기 때문에 생략했습니다.

유니코드 문자를 처리해야 하는 경우 xelatex 또는 lualatex에서 컴파일을 수행해야 합니다.

\documentclass{article}
\usepackage{tokcycle,xcolor}
\newcommand\formatchar[1]{\textcolor{red}{#1}}
\def\split#1{%
  \tokencycle{\formatchar{##1}\splitchar}
  {}{}{##1\splitchar}#1\endtokencycle}
\newcommand\splitchar{\tcpeek\z\ifx\empty\z\else$\mid$\fi}
\begin{document}
\split{ABCD}

\split{Å ÄÖ}
\end{document}

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

관련 정보