可変長引数マクロ(expl3)

Re: 可変長引数マクロ(expl3)

- 帯田 木偶太 の投稿
返信数: 0
カンマで分割するのは、LaTeX 標準の \@for でできます。
ただ、カンマ区切りしか扱えません。
区切り文字をオプション指定できるような拡張も北見 けんさんによって
        https://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/15266.html
に発表されていたりしますが、そのままではアンパサンド区切りは
エラーになるようです。\titlerow の定義をさらにいじって
アンパサンド区切りに対応させることもできましたが、
今度は \multicolumn を埋め込むことができなくなってしまいました。
※  多分、\multicolumn 自身がアラインメントをいじるので、それとの
    整合性がとれないんだろうと思いますが、この点の解決は私の手には
    負えません。

========================================================================

        \documentclass{article}\relax
        \makeatletter
                % \@for の拡張(by 北見 けんさん):ここから
                        \def\@for{\begingroup\@testopt\ex@for@ini,}
                        %\@testoptが、\reserved@a~d を変えてしまうのを隠蔽します。
                        %\@for は、\@for\reserved@b:=\list{\job}の形で使われたりするので。
                        \long\def\ex@for@ini[#1]#2:=#3\do{%
                        \endgroup
                        \long\def\ex@forloop##1#1##2\@@##3##4{%
                            \def##3{##1}%
                            \ifx##3\@nnil\ex@for@break\fi
                            ##4%
                            \ex@forloop##2\@@##3{##4}}%
                            %  この部分は、例えば区切り文字が[,]で与えられたとすると
                            %  \long\def\ex@forloop#1,#2\@@#3#4{%
                            %      \def#3{#1}%
                            %      \ifx#3\@nnil\ex@for@break\fi
                            %      #4%
                            %      \ex@forloop#2\@@#3{#4}}%
                            %  という定義をすることになります。
                            %  #3 が項目を入れるマクロで、#4 がジョブ、#1,#2 がリストです。
                        \expandafter\def\expandafter\@fortmp\expandafter{#3}%
                        \ifx\@fortmp\@empty\ex@for@break\fi
                        \expandafter\ex@forloop#3#1\@nil#1\@@#2}
                        \long\def\ex@for@break#1\@@#2#3{\fi}
                            %  このマクロは、下の例のように、
                            %  ジョブの中で \if と \fi の間に置けば、
                            %  ループを抜けるのに使えます。
                %  \@for の拡張:ここまで
                \let\AmpChar=&%
                \chardef\AmpCharCatCode=\catcode`\&
                \catcode`\&=12\relax
                \newcommand*\titlerow{%
                        \catcode`\&=12\relax
                        \titlerow@
                }
                \newcommand*\titlerow@[1]{%
                        \catcode`\&=\AmpCharCatCode
                        \let\reserved@a=\@empty
                        \@for[&]\reserved@b:=#1\do{%
                                \ifx \reserved@a \@empty
                                        \toks@={}%
                                \else
                                        \toks@=\expandafter{\reserved@a\AmpChar}%
                                \fi
                                \@temptokena=\expandafter{\reserved@b}%
                                \edef\reserved@a{%
                                        \the\toks@
                                        % \multicolumn を入れるとエラーになるので
                                        % ちょっとごまかし
                                                \hfill\noexpand\textbf{\the\@temptokena}%
                                                \hfill\null
                                }%
                        }%
                        \reserved@a
                }
                \catcode`\&=\AmpCharCatCode
        \makeatother
        \begin{document}
        \begin{tabular}{llllll}
                \titlerow{bold 1&bold 2&bold 3&bold 4}\\
                \titlerow{bold 5&bold 6}\\
                medium 1 & medium 2 & medium 3
        \end{tabular}
        \end{document}