带有脚注的表格用于各种目的

带有脚注的表格用于各种目的

我正在寻找一种方法来保持脚注文本的一致性。因此我测试了一些选项:

  • tabu、longtabu 和 longtable
  • 表格脚注

第一种方法(tabu、longtabu 和 longtable)在我看来最有前途,因为它既可用于长表也可用于短表。但它的缺点是只能在页面末尾放置注释。

第二种方法(tablefootnotes)可用于几个表格环境,并提供命令\tablefootnote。它也只将脚注放在页面末尾。

第三种方法(ctable)是我目前使用的方法。它在表格后面放置假脚注。但它们没有超链接,并且与文本中的脚注不一致。

所以我的问题是是否有人知道一种方法,我可以使用表格中的脚注执行以下操作:

  • 根据需要,将注释放在表格后面或页面末尾
  • 与文本中的常规脚注保持一致(因此\footnote命令是可取的)
  • 最好使用超链接脚注

我已经尝试了很多方法,但没有具体的解决方案。

答案1

以下解决方案很有效。我注意到它唯一不起作用的是para选项threeparttable

\documentclass{scrartcl}

\usepackage{blindtext}

\usepackage{tabu,longtable}
\usepackage{threeparttable} % <-- the package below already loads it
\usepackage[referable]{threeparttablex}
\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{hyperref}
%\usepackage{caption} % <-- format captions, keep consistency
                      %     and provides \captionof
\abovetopsep=1ex % <-- controls the space between caption (top) and float


\usepackage{etoolbox}
\makeatletter
\chardef\TPT@@@asteriskcatcode=\catcode`*
\catcode`*=11
\expandafter\patchcmd\csname\string\threeparttable\endcsname
{\TPT@hookin{tabular}}
{\TPT@hookin{tabular}\TPT@hookin{tabu}}
{}{}
\catcode`*=\TPT@@@asteriskcatcode
\makeatother

\hbadness=10000
\vbadness=10000

\begin{document}

\listoftables

\bigskip

\blindtext

\begin{table}[htbp]
\centering
\begin{threeparttable}
\caption{A regular tabular}
\begin{tabu}{lll} % <-- also works with tabular or tabularx or
                  %   \begin{tabu} to \linewidth {XXX}
\toprule
Column 1 & & Column 2 \\
\midrule
AAAA & & BBBB\tnotex*{tn:cc} \\
CCCC & & DDDD\tnotex{tn:dd} \\
\bottomrule
\end{tabu}
\begin{tablenotes}
\footnotesize
\item[e] \label{tn:cc} Footnote in regular table 1 (not linked).
\item[f] \label{tn:dd} Footnote in regular table 2.
\source Some general note
\end{tablenotes}
\end{threeparttable}
\end{table}

\blindtext\footnote{This is a footnote in the text.}.

\begin{ThreePartTable} % <-- the construction above works with longtable
                       %     but does not allow page break
\begin{TableNotes}
\footnotesize
\item[a] \label{tn:aa} Footnote in long table 1 (not linked).
\item[b] \label{tn:bb} Footnote in long table 2.
\source Some general note
\end{TableNotes}
\captionof{table}{A long table} % <-- caption inside longtabu within
                                %     ThreePartTable does not produce
                                %     correct hyperlink in LOT
\vspace{-\abovecaptionskip} % <-- removes the extra space (correct value?) 
\begin{longtabu}{lll} % <-- also works with longtable and
                      %     \begin{longtabu} to \linewidth {XXX}
%\caption{A long table} \\
\toprule
Column 1 & & Column 2 \\
\midrule
\endfirsthead
\caption[]{A long table} \\
\toprule
Column 1 & & Column 2 \\
\midrule
\endhead
\cmidrule{3-3}
\multicolumn{3}{r}{\small\textit{continued}}
\endfoot
\bottomrule
\insertTableNotes\\
\endlastfoot
AAAA\tnotex*{tn:aa} & & BBBB \\
\newpage % <-- just testing break page
CCCC & & DDDD\tnotex{tn:bb} \\
\end{longtabu}
\end{ThreePartTable}

\blindtext

\end{document}

这使:在此处输入图片描述

希望这能为那些正在寻找相同解决方案的人提供帮助。

答案2

以下代码确实适用于tabutabular和 ,tabularx无论是否在 内table。但是 hyperref 必须使用 加载hyperfootnotes=false

\documentclass{report}

%Thanks to David Carlisle for pushftn and popftn : http://tex.stackexchange.com/a/43695/7128
\makeatletter
\newtoks\FTN@ftn
\def\pushftn{%
 \let\@footnotetext\FTN@ftntext\let\@xfootnotenext\FTN@xftntext
  \let\@xfootnote\FTN@xfootnote}
\def\popftn{%
 \global\FTN@ftn\expandafter{\expandafter}\the\FTN@ftn}
\long\def\FTN@ftntext#1{%
  \edef\@tempa{\the\FTN@ftn\noexpand\footnotetext
                    [\the\csname c@\@mpfn\endcsname]}%
  \global\FTN@ftn\expandafter{\@tempa{#1}}}%
\long\def\FTN@xftntext[#1]#2{%
  \global\FTN@ftn\expandafter{\the\FTN@ftn\footnotetext[#1]{#2}}}
\def\FTN@xfootnote[#1]{%
   \begingroup
     \csname c@\@mpfn\endcsname #1\relax
     \unrestored@protected@xdef\@thefnmark{\thempfn}%
   \endgroup
   \@footnotemark\FTN@xftntext[#1]}

\makeatother

\usepackage[hyperfootnotes=false]{hyperref}
%\usepackage{hyperref}
%\usepackage{footmisc}
\usepackage{varwidth}
\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{tabu}

\begin{document}

\begin{table}[htbp]
\begin{varwidth}{\textwidth}
\caption{Testing table}
\renewcommand{\footnoterule}{\vspace{-0.5\skip\footins}}
%\renewcommand{\footnoterule}{}
\begingroup\pushftn
\begin{tabu} to \linewidth{lX}
\toprule
a & b\footnote{AB} \\
\midrule
c & d\footnote{CD} \\
\bottomrule
\end{tabu}
\endgroup\popftn
\end{varwidth}
\end{table}

\noindent
Some text\footnote{This is a footnote.}.

\end{document}

答案3

我在这方面已经取得了一些进展。

以下 MWE 几乎按照我想要的方式工作。

\documentclass{article}

\usepackage{hyperref}
\usepackage{longtable,tabu}
\usepackage{tablefootnote}

\newenvironment{alphafootnotes}
  {\par\edef\savedfootnotenumber{\number\value{footnote}}
   \renewcommand{\thefootnote}{\alph{footnote}}
   \setcounter{footnote}{0}}
  {\par\setcounter{footnote}{\savedfootnotenumber}}

\makeatletter
\newcommand{\spewnotes}{%
\tfn@tablefootnoteprintout%
\global\let\tfn@tablefootnoteprintout\relax%
\gdef\tfn@fnt{0}%
}
\makeatother


\begin{document}

\begin{table}
\begin{minipage}{\textwidth}
\begin{alphafootnotes}
\begin{tabu} to \textwidth{lX}
aa & bb\tablefootnote{Footnote within table.} \\
cc & dd
\end{tabu}
\end{alphafootnotes}
\spewnotes
\end{minipage}
\end{table}

This is a footnote\footnote{Here is a footnote within the footnote}.

\newpage

Some text in new page.

\end{document}

存在一些问题:

  1. 如果我使用tabular脚注编号则不会打印;
  2. 如果我使用tabu(或longtabu),则不会打印脚注编号并且打印脚注文本两次;
  3. 如果我像在 MWE 中那样使用tabu to width(或),则不会打印脚注编号并且会打印脚注文本 3 次。longtabu to width

然而,除了脚注文本的额外打印之外,超链接似乎工作正常,因为它转到脚注文本的最后一次打印。

有没有办法可以打印脚注编号并避免额外打印脚注文本?

相关内容