我正在尝试定义我自己的版本 ( \CLINE
) \cline
,使得
\CLINE{1-3,5-7}
等同于
\cline{1-3}\cline{5-7}
。
因此我想\cline
使用非文字参数调用,如下所示:
\def\arg{1-3}
...
\cline{\arg}
但这会导致出现错误消息:
Runaway argument?
\xx \@nil \cline {5-7} 1&2&3&4&5&6&7\\ \end {tabular} \end document}\ETC.
! File ended while scanning use of \@cline.
有没有更好的方法可以做到这一点? 到目前为止,这是我所拥有的:
\documentclass{article}
\usepackage[papersize={60mm,30mm},margin=5mm,noheadfoot]{geometry}
\usepackage{xstring}
\pagestyle{empty}
\parindent0pt
\def\CLINE#1{%
\def\arg{#1}% \arg -> 1-3,5-7
\loop%
\iftrue%
\StrCut{\arg}{,}{\X}{\arg}% first cycle: \X → 1-3 \arg → 5-7
% secnd cycle: \X → 5-7 \arg → empty
\typeout{cline argument: \X}%
\cline{\X}% first cycle: \cline{1-3}
% secnd cycle: \cline{5-7}
\ifx\arg\empty\let\iterate\relax\fi%
\repeat%
}
\begin{document}
\begin{tabular}{ccccccc}\hline
1&2&3&4&5&6&7\\\cline{1-3}\cline{5-7}
1&2&3&4&5&6&7\\\CLINE{1-3,5-7}
1&2&3&4&5&6&7\\
\end{tabular}
\end{document}
答案1
您必须使用基于扩展的宏;赋值不行。在评估时,TeX 处于特别不稳定的状态:任何不可扩展的标记都会结束或的\cline
搜索并开始新的对齐单元。\omit
\noalign
\documentclass{article}
\def\CLINE#1{\CLINEA#1,,}
\def\CLINEA#1,{\ifx,#1,\else \cline{#1}\expandafter\CLINEA\fi}
\begin{document}
\begin{tabular}{ccccccc}\hline
1&2&3&4&5&6&7\\\cline{1-3}\cline{5-7}
1&2&3&4&5&6&7\\\CLINE{1-3,5-7}
1&2&3&4&5&6&7\\
\end{tabular}
\end{document}
(代码借自擦拭)
如果你想执行循环,你必须在里面执行\noalign
,例如
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\CLINE}{m}
{
\noalign{\CLINE_split:n { #1 } }
}
\cs_new_protected:Nn \CLINE_split:n
{
\tl_gclear:N \g_tmpa_tl
\clist_map_inline:nn { #1 }
{
\tl_gput_right:Nn \g_tmpa_tl { \cline{##1} }
}
\group_insert_after:N \g_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\begin{tabular}{ccccccc}\hline
1&2&3&4&5&6&7\\\cline{1-3}\cline{5-7}
1&2&3&4&5&6&7\\\CLINE{1-3,5-7}
1&2&3&4&5&6&7\\
\end{tabular}
\end{document}
在我看来,您的方法太复杂了;拆分以逗号分隔的参数列表可以更容易地完成,如您在两个示例中看到的那样。