マクロを作成するにはどうすればいいですか
\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
ため、名前を に変更しました。\split
amsmath
\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 でエンコードされた文字を直接処理できるバージョンの関数と関数を使用しています。sub
gsub
sub
メインのユーザーレベルマクロは\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}