在带有 \@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

令我困惑的是这两个调用之间的区别——在我看来,它们应该做同样的事情,但输出却不一样。

现在,我确实计划@在最终版本中包含上述命令,但为了调试,我希望能够在样式文件之外调用它们。此外,NoStar 的参数未被使用,一旦正常工作,它将被放入多列中。

答案1

此解决方案基于 Heiko 在! 放错位置的\omit错误

etextools提供完全可扩展的条件命令,允许\multicolumn被视为“单元格中的第一个元素”。目前您的示例中并非如此,因为\@ifstar不是完全可扩展的,而是\FE@ifstar一个F完全E可扩展的版本:

在此处输入图片描述

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

相关内容