检查这个例子(使用包longtable
和spreadtab
)清零行在开始和结束处。这两行通过 变为不可见,并在开始时\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
表格序言(
\unexpanded
确保它不被触及\edef
)表体,取自
\the\tablecontents
表格后记
然后\x
执行排版表格。