저는 패키지 작성이 처음인데 해결할 수 없는 오류를 발견했습니다. 도움을 주시면 감사하겠습니다. 나는 테이블 형식 환경 내에서 사용하기 위한 몇 가지 매크로를 작성 중입니다.
\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
이므로 현재 귀하의 예에서는 그렇지 않습니다 .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}