\@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완전히 확장 가능하지 않지만 ully xpandable 버전 \FE@ifstar이므로 현재 귀하의 예에서는 그렇지 않습니다 .FE

여기에 이미지 설명을 입력하세요

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

관련 정보