我正在寻找一种方法来保持脚注文本的一致性。因此我测试了一些选项:
- 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
以下代码确实适用于tabu
、tabular
和 ,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}
存在一些问题:
- 如果我使用
tabular
脚注编号则不会打印; - 如果我使用
tabu
(或longtabu
),则不会打印脚注编号并且打印脚注文本两次; - 如果我像在 MWE 中那样使用
tabu to width
(或),则不会打印脚注编号并且会打印脚注文本 3 次。longtabu to width
然而,除了脚注文本的额外打印之外,超链接似乎工作正常,因为它转到脚注文本的最后一次打印。
有没有办法可以打印脚注编号并避免额外打印脚注文本?