リスト ASCIIスペース文字の解析

リスト ASCIIスペース文字の解析

私は etoolbox のリスト解析機能を使用してきましたが、スペースで区切られたリストが必要な奇妙なユースケースがあります。

\usepackage{etoolbox}
\DeclareListParser*{\symbolListParser}{<symbol for space character>}
\newcommand{\processSymbolList}[1]{
    \symbolListParser{}{#1}
}

どこから調べ始めたらよいのかさえわかりません。リストに関するドキュメント、スペースに関するドキュメント、ASCII 文字に関するドキュメントをしばらく探し回ったのですが、役に立ちませんでした。

ですので、どうすればいいのか、どこを見ればいいのか、あるいはそれが不可能なのかを教えていただけると本当にありがたいです。

アップデート:私は見つけたこれしかし私はOPが望んでいたようなもう少しきれいなものを探していました

更新2:回答してくれたTobiに感謝します。私はそれを受け入れました。以下は、リストパーサーのように動作するspacelistのより一般的なバージョンです。

\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{ \spacelist }{ mm }{
    \seq_set_split:Nnn \l_tmpa_seq { ~ } { #2 }
    \seq_map_inline:Nn \l_tmpa_seq {
        #1{##1}
    }
}

\ExplSyntaxOff

% to use you would write it like:
\spacelist{\fbox}{Boxes and Spaces in a List}

答え1

ここでは、expl3

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{ \spacelist }{ m }{
   \seq_set_split:Nnn \l_tmpa_seq { ~ } { #1 }
   \seq_map_inline:Nn \l_tmpa_seq {
      \fbox { ##1 }
   }
}

\ExplSyntaxOff

\begin{document}
List: \spacelist{Boxes and Spaces in a List}
\end{document}

このコードはいわゆるシーケンスこれは、引数#1\spacelistスペースで分割することによって生成されます。~スペースは新しい構文* にあり、通常のスペースは無視されます。シークインは、 という名前のローカルの一時変数に格納され\l_tempa_seq、 を使用して、\seq_map_inlineシーケンスのすべての項目を反復処理できます。現在の項目は引数コード として指定されます#1が、ここでは##1マッピングが定義内にネストされているためです。

\fboxニーズに合わせて部品を交換することもできます…


*新しい構文は、LaTeX3 で導入された構文を意味します。これは現在、expl3パックされた として利用可能であり、 によってロードされますxparse。詳細については、expl3またはのマニュアルを参照してくださいsource3

答え2

パッケージlistofitemsは、レンダリングされた形式またはトークン化されていない形式のいずれかでそれを提供できます。

\documentclass{article}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage{listofitems}
\newcommand\spacelist[2][]{
  \setsepchar{ }%
  \readlist\mylist{#2}%
  \showitems#1\mylist%
}
\begin{document}
List: \spacelist{Boxes and \textbf{Spaces} in a List}

Tokens: \spacelist[*]{Boxes and \textbf{Spaces} in a List}
\end{document}

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

答え3

目標に対してパッケージを使用しないアプローチを 2 行の TeX マクロで記述できます。

\documentclass{article}

\catcode`z 3
\makeatletter
\newcommand\spacelist[1]{\spacelist@boxit #1 {z} }%
\long\def\spacelist@boxit #1 {\ifx z#1\relax\else
         \fbox{#1}\expandafter\spacelist@boxit\fi}
\catcode`z 11
\makeatother

\begin{document}
List: \spacelist{Boxes and Spaces in a List}
\end{document}

罪の告白: 解析されたリストに\elseまたは\fiトークンが含まれている場合、この方法は脆弱です。

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

ここでは、より堅牢な方法を簡単に説明します。ただし、引数には catcode 3 文字の Z を含めないでください...

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

\catcode`Z 3
\makeatletter
\newcommand\spacelist[1]{\spacelist@getone{}#1 Z }%
\long\def\spacelist@getone #1 {\spacelist@check #1.Z\spacelist@check{#1}}%
\long\def\spacelist@check  #1Z#2\spacelist@check#3%
        {\if\relax\detokenize{#1}\relax
         \expandafter\@gobbletwo % abort parse
         \else
%
% #3 contains the searched for item, but with an empty brace pair
% added, which serves to prevent brace removal in processing
% so I am showing here how to remove it with \expandafter/\@gobble
% initial braces are not lost.
% 
         \fbox{\detokenize\expandafter{\@gobble#3}}%
         \fi
         \spacelist@getone{}}%
\catcode`Z 11
\makeatother

\begin{document}
List: \spacelist{Boxes {and Spaces} in a {List with \if, \else, \end tokens}}

\end{document}

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

関連情報