![如何创建自定义表格环境并支持表格脚注](https://linux22.com/image/367243/%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%A1%A8%E6%A0%BC%E7%8E%AF%E5%A2%83%E5%B9%B6%E6%94%AF%E6%8C%81%E8%A1%A8%E6%A0%BC%E8%84%9A%E6%B3%A8.png)
我正在尝试创建具有以下属性的自定义表环境:
- 它可能很长(即超过一页),所以我需要使用
longtable
- 它可能有(也可能没有)脚注。
我在这里提供了一个示例来说明我尝试做的事情。我有两个表格,一个“大写”表格和一个“小写”表格。大写表格没有脚注,而小写表格有。
\documentclass{scrartcl}
\usepackage{longtable}
\usepackage[referable]{threeparttablex}
\usepackage{booktabs}
\title{MWE}
\author{jlconlin}
\newenvironment{letterTable}{%
\begin{longtable}{rl}
\toprule
Letter & Index \\
\midrule
\endfirsthead
continued \\
\toprule
Letter & Index \\
\midrule
\endhead
\bottomrule
\emph{Continued on next page}
\endfoot
\bottomrule
\insertTableNotes
\endlastfoot
}
{\end{longtable}}
\begin{document}
\maketitle
\begin{letterTable}
A & 1 \\
B & 2 \\
C & 3 \\
D & 4 \\
E & 5 \\
F & 6 \\
G & 7 \\
H & 8 \\
I & 9 \\
J & 10 \\
K & 11 \\
L & 12 \\
M & 13 \\
N & 14 \\
O & 15 \\
P & 16 \\
Q & 17 \\
R & 18 \\
S & 19 \\
T & 20 \\
U & 21 \\
V & 22 \\
W & 23 \\
X & 24 \\
Y & 25 \\
Z & 26 \\
\end{letterTable}
\begin{ThreePartTable}
\begin{TableNotes}
\item[a] \label{tn:a} lowercase A
\item[b] \label{tn:b} lowercase B
\item[c] \label{tn:c} lowercase C
\item[d] \label{tn:d} lowercase D
\item[e] \label{tn:e} lowercase E
\item[f] \label{tn:f} lowercase F
\item[g] \label{tn:g} lowercase G
\item[h] \label{tn:h} lowercase H
\item[i] \label{tn:i} lowercase I
\item[j] \label{tn:j} lowercase J
\item[k] \label{tn:k} lowercase K
\item[l] \label{tn:l} lowercase L
\item[m] \label{tn:m} lowercase M
\item[n] \label{tn:n} lowercase N
\item[o] \label{tn:o} lowercase O
\item[p] \label{tn:p} lowercase P
\item[q] \label{tn:q} lowercase Q
\item[r] \label{tn:r} lowercase R
\item[s] \label{tn:s} lowercase S
\item[t] \label{tn:t} lowercase T
\item[u] \label{tn:u} lowercase U
\item[v] \label{tn:v} lowercase V
\item[w] \label{tn:w} lowercase W
\item[x] \label{tn:x} lowercase X
\item[y] \label{tn:y} lowercase Y
\item[z] \label{tn:z} lowercase Z
\end{TableNotes}
\begin{letterTable}
a\tnotex{tn:a} & 1 \\
b\tnotex{tn:b} & 1 \\
c\tnotex{tn:c} & 1 \\
d\tnotex{tn:d} & 1 \\
e\tnotex{tn:e} & 1 \\
f\tnotex{tn:f} & 1 \\
g\tnotex{tn:g} & 1 \\
h\tnotex{tn:h} & 1 \\
i\tnotex{tn:i} & 1 \\
j\tnotex{tn:j} & 1 \\
k\tnotex{tn:k} & 1 \\
l\tnotex{tn:l} & 1 \\
m\tnotex{tn:m} & 1 \\
n\tnotex{tn:n} & 1 \\
o\tnotex{tn:o} & 1 \\
p\tnotex{tn:p} & 1 \\
q\tnotex{tn:q} & 1 \\
r\tnotex{tn:r} & 1 \\
s\tnotex{tn:s} & 1 \\
t\tnotex{tn:t} & 1 \\
u\tnotex{tn:u} & 1 \\
v\tnotex{tn:v} & 1 \\
w\tnotex{tn:w} & 1 \\
x\tnotex{tn:x} & 1 \\
y\tnotex{tn:y} & 1 \\
z\tnotex{tn:z} & 1 \\
\end{letterTable}
\end{ThreePartTable}
\end{document}
在此示例中,大写字母表格在前面 — — LaTeX 无法编译并出现以下错误:
!LaTeX 错误:出现错误 — — 可能缺少 \item。
请参阅 LaTeX 手册或 LaTeX Companion 了解解释。输入 H 可立即获得帮助。...
l.51 \begin{字母表}
如果我移动大写表格(没有表格脚注)后小写表格(带表格脚注),则一切都可以正常编译。
- 这里的顺序为什么很重要?
- 我该怎么做才能修复此问题以使顺序不再重要?
答案1
您可以尝试测试tablenotesbody的内容:
\documentclass{scrartcl}
\usepackage{longtable}
\usepackage[referable]{threeparttablex}
\usepackage{booktabs}
\usepackage{etoolbox}
\title{MWE}
\author{jlconlin}
\makeatletter
\newenvironment{letterTable}{%
\begin{longtable}{rl}
\toprule
Letter & Index \\
\midrule
\endfirsthead
% continued \\
\toprule
Letter & Index \\
\midrule
\endhead
\bottomrule
\emph{Continued on next page}
\endfoot
\bottomrule
\ifcsempty{TPTL@body}{}{%test
\insertTableNotes
\csgdef{TPTL@body}{}% delete the body
}
\endlastfoot
}
{\end{longtable}}
\begin{document}
%\maketitle
\begin{letterTable}
A & 1 \\
B & 2 \\
C & 3 \\
D & 4 \\
E & 5 \\
F & 6 \\
G & 7 \\
H & 8 \\
I & 9 \\
J & 10 \\
K & 11 \\
L & 12 \\
M & 13 \\
N & 14 \\
O & 15 \\
P & 16 \\
Q & 17 \\
R & 18 \\
S & 19 \\
T & 20 \\
U & 21 \\
V & 22 \\
W & 23 \\
X & 24 \\
Y & 25 \\
Z & 26 \\
\end{letterTable}
\begin{ThreePartTable}
\begin{TableNotes}
\item[a] \label{tn:a} lowercase A
\item[b] \label{tn:b} lowercase B
\item[c] \label{tn:c} lowercase C
\item[d] \label{tn:d} lowercase D
\item[e] \label{tn:e} lowercase E
\item[f] \label{tn:f} lowercase F
\item[g] \label{tn:g} lowercase G
\item[h] \label{tn:h} lowercase H
\item[i] \label{tn:i} lowercase I
\item[j] \label{tn:j} lowercase J
\item[k] \label{tn:k} lowercase K
\item[l] \label{tn:l} lowercase L
\item[m] \label{tn:m} lowercase M
\item[n] \label{tn:n} lowercase N
\item[o] \label{tn:o} lowercase O
\item[p] \label{tn:p} lowercase P
\item[q] \label{tn:q} lowercase Q
\item[r] \label{tn:r} lowercase R
\item[s] \label{tn:s} lowercase S
\item[t] \label{tn:t} lowercase T
\item[u] \label{tn:u} lowercase U
\item[v] \label{tn:v} lowercase V
\item[w] \label{tn:w} lowercase W
\item[x] \label{tn:x} lowercase X
\item[y] \label{tn:y} lowercase Y
\item[z] \label{tn:z} lowercase Z
\end{TableNotes}
\begin{letterTable}
a\tnotex{tn:a} & 1 \\
b\tnotex{tn:b} & 1 \\
c\tnotex{tn:c} & 1 \\
d\tnotex{tn:d} & 1 \\
e\tnotex{tn:e} & 1 \\
f\tnotex{tn:f} & 1 \\
g\tnotex{tn:g} & 1 \\
h\tnotex{tn:h} & 1 \\
i\tnotex{tn:i} & 1 \\
j\tnotex{tn:j} & 1 \\
k\tnotex{tn:k} & 1 \\
l\tnotex{tn:l} & 1 \\
m\tnotex{tn:m} & 1 \\
n\tnotex{tn:n} & 1 \\
o\tnotex{tn:o} & 1 \\
p\tnotex{tn:p} & 1 \\
q\tnotex{tn:q} & 1 \\
r\tnotex{tn:r} & 1 \\
s\tnotex{tn:s} & 1 \\
t\tnotex{tn:t} & 1 \\
u\tnotex{tn:u} & 1 \\
v\tnotex{tn:v} & 1 \\
w\tnotex{tn:w} & 1 \\
x\tnotex{tn:x} & 1 \\
y\tnotex{tn:y} & 1 \\
z\tnotex{tn:z} & 1 \\
\end{letterTable}
\end{ThreePartTable}
\end{document}
答案2
使用etoolbox
es\AtBeginEnvironment
可以轻松解决这个问题。
这里\myInsertTableNotes
使用,最初定义为
\let\myInsertTableNotes\relax
所以什么也不做。
\AtBeginEnvironment{ThreePartTable}{\let\myInsertTableNotes\insertTableNotes}
宏设置为\insertTableNotes
在之内ThreePartTable
。
代码:
\documentclass{scrartcl}
\usepackage{longtable}
\usepackage[referable]{threeparttablex}
\usepackage{booktabs}
\usepackage{etoolbox}
\title{MWE}
\author{jlconlin}
\newenvironment{letterTable}{%
\begin{longtable}{rl}
\toprule
Letter & Index \\
\midrule
\endfirsthead
continued \\
\toprule
Letter & Index \\
\midrule
\endhead
\bottomrule
\emph{Continued on next page}
\endfoot
\bottomrule
\myInsertTableNotes
\endlastfoot
}
{\end{longtable}}
\let\myInsertTableNotes\relax
\AtBeginEnvironment{ThreePartTable}{\let\myInsertTableNotes\insertTableNotes}
\begin{document}
\maketitle
\begin{letterTable}
A & 1 \\
B & 2 \\
C & 3 \\
D & 4 \\
E & 5 \\
F & 6 \\
G & 7 \\
H & 8 \\
I & 9 \\
J & 10 \\
K & 11 \\
L & 12 \\
M & 13 \\
N & 14 \\
O & 15 \\
P & 16 \\
Q & 17 \\
R & 18 \\
S & 19 \\
T & 20 \\
U & 21 \\
V & 22 \\
W & 23 \\
X & 24 \\
Y & 25 \\
Z & 26 \\
\end{letterTable}
\begin{ThreePartTable}
\begin{TableNotes}
\item[a] \label{tn:a} lowercase A
\item[b] \label{tn:b} lowercase B
\item[c] \label{tn:c} lowercase C
\item[d] \label{tn:d} lowercase D
\item[e] \label{tn:e} lowercase E
\item[f] \label{tn:f} lowercase F
\item[g] \label{tn:g} lowercase G
\item[h] \label{tn:h} lowercase H
\item[i] \label{tn:i} lowercase I
\item[j] \label{tn:j} lowercase J
\item[k] \label{tn:k} lowercase K
\item[l] \label{tn:l} lowercase L
\item[m] \label{tn:m} lowercase M
\item[n] \label{tn:n} lowercase N
\item[o] \label{tn:o} lowercase O
\item[p] \label{tn:p} lowercase P
\item[q] \label{tn:q} lowercase Q
\item[r] \label{tn:r} lowercase R
\item[s] \label{tn:s} lowercase S
\item[t] \label{tn:t} lowercase T
\item[u] \label{tn:u} lowercase U
\item[v] \label{tn:v} lowercase V
\item[w] \label{tn:w} lowercase W
\item[x] \label{tn:x} lowercase X
\item[y] \label{tn:y} lowercase Y
\item[z] \label{tn:z} lowercase Z
\end{TableNotes}
\begin{letterTable}
a\tnotex{tn:a} & 1 \\
b\tnotex{tn:b} & 1 \\
c\tnotex{tn:c} & 1 \\
d\tnotex{tn:d} & 1 \\
e\tnotex{tn:e} & 1 \\
f\tnotex{tn:f} & 1 \\
g\tnotex{tn:g} & 1 \\
h\tnotex{tn:h} & 1 \\
i\tnotex{tn:i} & 1 \\
j\tnotex{tn:j} & 1 \\
k\tnotex{tn:k} & 1 \\
l\tnotex{tn:l} & 1 \\
m\tnotex{tn:m} & 1 \\
n\tnotex{tn:n} & 1 \\
o\tnotex{tn:o} & 1 \\
p\tnotex{tn:p} & 1 \\
q\tnotex{tn:q} & 1 \\
r\tnotex{tn:r} & 1 \\
s\tnotex{tn:s} & 1 \\
t\tnotex{tn:t} & 1 \\
u\tnotex{tn:u} & 1 \\
v\tnotex{tn:v} & 1 \\
w\tnotex{tn:w} & 1 \\
x\tnotex{tn:x} & 1 \\
y\tnotex{tn:y} & 1 \\
z\tnotex{tn:z} & 1 \\
\end{letterTable}
\end{ThreePartTable}
\end{document}