在帶有 \@ifstar 的新命令中使用時出現多列錯誤

在帶有 \@ifstar 的新命令中使用時出現多列錯誤

我是編寫軟體包的新手,遇到了一個無法解決的錯誤,我將不勝感激您可以提供的任何幫助。我正在編寫一些用於表格環境中的巨集:

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

當我打電話時

\topicsNoStar{stuff} 

輸出是正確的。

當我打電話時

\topics{stuff} 

我收到錯誤訊息:!Misplaced \omit. \multispan ->\omit \@multispan

讓我困惑的是這兩個呼叫之間的區別 - 在我看來,它們應該做同樣的事情,但輸出並不相同。

現在,我確實計劃@在最終版本的上述命令中包含 's ,但是為了調試,我希望能夠在樣式文件之外調用它們。此外,未使用 NoStar 的參數,一旦正常工作,它將放入多列中。

答案1

該解決方案是基於 Heiko 在中提出的要求而構建的!錯位\omit錯誤

etextools提供完全可擴展的條件命令,以允許\multicolumn被視為「單元中的第一個元素」。目前您的範例中並非如此,因為\@ifstar它不完全可擴展,\FE@ifstar而是Fully Expandable 版本:

在此輸入影像描述

\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}

相關內容