如何创建自定义表格环境并支持表格脚注

如何创建自定义表格环境并支持表格脚注

我正在尝试创建具有以下属性的自定义表环境:

  • 它可能很长(即超过一页),所以我需要使用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

使用etoolboxes\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}

相关内容