文字列を文字単位で分割し、書式付きで結合する

文字列を文字単位で分割し、書式付きで結合する

マクロを作成するにはどうすればいいですか

\split{ABC}

出力

ここに画像の説明を入力してください

文字の書式設定は別のマクロで行われます。つまり

\formatchar{A}

どこ

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

任意の文字列の長さですか?

私はコードを変更しようとしました 文字列を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}

ここに画像の説明を入力してください

リストのような出力を得るために、最後の 2 つの項目の間に異なる区切り文字を許可する拡張機能を次に示します。

\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

これは Lua の組み込み関数gsubと関数を使用する LuaLaTeX ベースのソリューションです。実際、コードでは、utf8 でエンコードされた文字を直接処理できるバージョンの関数と関数を使用しています。subgsubsub

メインのユーザーレベルマクロは\splitstringではなく が呼び出されます\splitアムスマスパッケージは、 およびsplitというマクロとともにという環境を定義します。\split\endsplit

(a) の引数には\splitstring空白を含めることができ、(b)formatcharは LaTeX マクロではなく 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 のソリューションは提供されていないため、ここで 1 つ示します。トークン サイクルを使用して、引数から文字を 1 つずつ取得します。このソリューションでは、引数にマクロやグループがないことを前提としています。必要に応じて処理できますが、処理方法に関するガイダンスが示されていないため、これらを省略しました。

Unicode 文字を処理する必要がある場合は、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}

ここに画像の説明を入力してください

関連情報