如何使用非文字参数调用 \cline?

如何使用非文字参数调用 \cline?

我正在尝试定义我自己的版本 ( \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}

在我看来,您的方法太复杂了;拆分以逗号分隔的参数列表可以更容易地完成,如您在两个示例中看到的那样。

相关内容