\@ifstar を使用した newcommand 内で使用すると、複数列エラーが発生します。

\@ifstar を使用した newcommand 内で使用すると、複数列エラーが発生します。

私はパッケージの作成に不慣れで、解決できないエラーに遭遇しています。何か助けていただけるとありがたいです。表形式の環境で使用することを目的としたマクロをいくつか作成しています。

\newcommand{\topics}{\@ifstar{\topicsStar}{\topicsNoStar}}
\newcommand{\topicsNoStar}[1]{\multicolumn{2}{|p{2in}|}{test}}
\newcommand{\topicsStar}{&&}

電話すると

\topicsNoStar{stuff} 

出力は正しいです。

電話すると

\topics{stuff} 

次のエラーメッセージが表示されます:!Misplaced \omit. \multispan ->\omit \@multispan

私を混乱させているのは、2 つの呼び出しの違いです。私の考えでは、それらは同じことを行うはずですが、出力は同じではありません。

さて、最終バージョンでは上記のコマンドに 's を含める予定です@が、デバッグのために、スタイル ファイルの外部で呼び出せるようにしたいと考えました。また、NoStar への引数は使用されませんが、これが正しく機能したら、マルチカラム内に配置されます。

答え1

このソリューションは、Heikoが提案した要件に基づいて構築されています。! 誤った\omitエラー

etextoolsは、完全に拡張可能な条件付けコマンドを提供し、 を「セルの最初の要素」と見なすことができます。は完全に拡張可能ではありませんが、 は完全に拡張可能なバージョンである\multicolumnため、この例では現時点では当てはまりません。\@ifstar\FE@ifstarFE

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

\documentclass{article}
\usepackage{etextools}% http://ctan.org/pkg/etextools
\makeatletter
\newcommand{\topics}[1]{%
  \FE@ifstar{#1}
    {test & test}% starred
    {\multicolumn{2}{|p{2in}|}{#1}\@gobble}}% non-starred
\makeatother
\begin{document}
\begin{tabular}{|p{1in}p{1in}|}
  \topics{stuff} \\
  \topics* \\
  \topics{some more stuff} \\
  \topics* \\
  \topics*
\end{tabular}
\end{document}

答え2

\multicolumnはテーブル セルの最初に記述する必要があり、通常の方法で定義されたスター バリアントを持つコマンドは、\multicolumn展開できないトークンの後に隠れます。パッケージを使用しない場合は、次の方法で実行できます。

\documentclass{article}
\newcommand{\topics}[1]{%
  \if*\detokenize{#1}%
    &%
  \else
    \multicolumn{2}{|p{2in}|}{#1}%
  \fi
}
\begin{document}
\begin{tabular}{|p{1in}p{1in}|}
  \topics{stuff} \\
  \topics* \\
  \topics{some more stuff} \\
  \topics* \\
  \topics*
\end{tabular}
\end{document}

答え3

これは代替案で、私の\NewDocumentCommandOptionalInTabularマクロを使って別の答え

\documentclass{article}

% ======== copy paste this part ========
\ExplSyntaxOn
\cs_new_protected:Npn \NewDocumentCommandOptionalInTabular #1 #2 #3 {
  \NewDocumentCommandOptionalInTabular_aux:xnnn {\exp_not:c{\cs_to_str:N #1-aux}} #1 {#2} {#3}
}

\cs_new_protected:Npn \NewDocumentCommandOptionalInTabular_aux:nnnn #1 #2 #3 #4 {
  \cs_new:Npn #2 { \noalign \bgroup #1 }
  \NewDocumentCommand #1 {#3} { \egroup #4 }
}
\cs_generate_variant:Nn \NewDocumentCommandOptionalInTabular_aux:nnnn {x}
\ExplSyntaxOff
% ======== end ========


\NewDocumentCommandOptionalInTabular \topics {s} {\IfBooleanTF{#1}{\topicsStar}{\topicsNoStar}}
\newcommand{\topicsNoStar}[1]{\multicolumn{2}{|p{2in}|}{#1}}
\newcommand{\topicsStar}{test & test}

\begin{document}
\begin{tabular}{|p{1in}p{1in}|}
  \topics{stuff} \\
  \topics* \\
  \topics{some more stuff} \\
  \topics* \\
  \topics*
\end{tabular}
\end{document}

出力は期待どおりです。

出力


拡張可能な星のテストによって次の文字のカーニングが壊れる例:

%! TEX program = pdflatex
\documentclass{article}
\usepackage{etextools}% http://ctan.org/pkg/etextools
\makeatletter
\newcommand{\test}[1]{%
  \FE@ifstar{#1}
    {123}
    {456}}
\makeatother

\begin{document}

\test VA  % ← see the space between V and A here is much larger than that of...

VA  % the space between V and A in this line.

\end{document}

関連情報