无法使用 \newcommand 拆分 Spreadtab LongTable

无法使用 \newcommand 拆分 Spreadtab LongTable

检查这个例子(使用包longtablespreadtab清零行在开始和结束处。这两行通过 变为不可见,并在开始时\phantom通过 向上移动。[-6.9mm]

\documentclass[12pt]{article}
\usepackage{spreadtab}
\usepackage{longtable}


\begin{document}

\begin{spreadtab}{{longtable}{cccc}}%
@\textbf{ONE} & @\textbf{TWO} & @\textbf{THREE} & @\textbf{FOUR} \\
[-5.6mm]\phantom{:={0}} & \phantom{:={0}} & \phantom{:={0}} & \phantom{:={0 tag(start)}} \\ \hline
5 & 6 & 7 & 8 \\ 
5 & 6 & 7 & 8 \\
5 & 6 & 7 & 8 \\
[-5.6mm]\phantom{:={0}} & \phantom{:={0}} & \phantom{:={0}} & \phantom{:={0 tag(stop)}} \\ \hline
&&& sum(cell(start):cell(stop))
\end{spreadtab}

\end{document}

这个例子有效。但我想要的是拆分桌子通过在文档前言中的某处定义三个命令。

第一个是\tablestart,第二个是\tablestop。然后我想定义第三个\input_row,以便用户可以轻松地写入行。

像这样:

\documentclass[12pt]{article}
\usepackage{spreadtab}
\usepackage{longtable}

\newcommand{\tablestart}{
    \begin{spreadtab}{{longtable}{cccc}}%
        @\textbf{ONE} & @\textbf{TWO} & @\textbf{THREE} & @\textbf{FOUR} \\
            [-5.6mm]\phantom{:={0}} & \phantom{:={0}} & \phantom{:={0}} & \phantom{:={0 tag(start)}} \\ \hline

}

\newcommand{\tablestop}{
        [-5.6mm]\phantom{:={0}} & \phantom{:={0}} & \phantom{:={0}} & \phantom{:={0 tag(stop)}} \\ \hline
    &&& sum(cell(start):cell(stop))
\end{spreadtab}

\newcommand{\inputrow}[4]{
    #1 & #2 & #3 & #4 \\
}

\begin{document}

\tablestart
\inputrow{5}{6}{7}{8}
\inputrow{5}{6}{7}{8}
\inputrow{5}{6}{7}{8}
\tablestop

\end{document}

问题:

虽然第一种方法有效,但第二种方法渲染失败,并xelatex main.tex返回下面列出的错误。为什么?

Runaway argument?
{ [-5.6mm]\phantom {:={0}} & \phantom {:={0}} & \phantom {:={0}} & \phantom \ET
C.
! File ended while scanning use of \@argdef.
<inserted text> 
                \par 
<*> test-v2.tex

答案1

您必须预先构建表格,并且不要在宏中隐藏行,因为spreadtab需要明确地“看到”它们。

\documentclass[12pt]{article}
\usepackage{spreadtab}
\usepackage{longtable}

\newtoks\tablecontents
\newcommand{\tablestart}{%
  \tablecontents={}% initialize
}
\newcommand{\inputrow}[4]{%
  \tablecontents=\expandafter{\the\tablecontents #1 & #2 & #3 & #4 \\}%
}

\newcommand{\tablestop}{%
  \begingroup\edef\x{\endgroup
    \unexpanded{%
      \begin{spreadtab}{{longtable}{cccc}}%
      @\textbf{ONE} & @\textbf{TWO} & @\textbf{THREE} & @\textbf{FOUR} \\
      [-5.6mm]\phantom{:={0}} & \phantom{:={0}} & \phantom{:={0}} & \phantom{:={0 tag(start)}} \\
      \hline
    }%
    \the\tablecontents
    \unexpanded{%
      [-5.6mm]\phantom{:={0}} & \phantom{:={0}} & \phantom{:={0}} & \phantom{:={0 tag(stop)}} \\
      \hline
      &&& sum(cell(start):cell(stop))
     \end{spreadtab}%
    }%
  }\x
}

\begin{document}

\tablestart
\inputrow{5}{6}{7}{8}
\inputrow{5}{6}{7}{8}
\inputrow{5}{6}{7}{8}
\tablestop

\end{document}

在此处输入图片描述

\tablestart除了将令牌寄存器初始化为空之外,新命令基本上不执行任何操作。

命令\inputrow逐渐添加到令牌寄存器中,最后\tablestop结束业务。

由于我们需要的内容spreadtab不隐藏在宏中,因此\x定义了一个临时宏。它将包含(它的作用只是在作业完成后\endgroup不离开定义),然后\x

  1. 表格序言(\unexpanded确保它不被触及\edef

  2. 表体,取自\the\tablecontents

  3. 表格后记

然后\x执行排版表格。

相关内容