使用 ctable 的标题和脚注宽度

使用 ctable 的标题和脚注宽度

我正在使用ctable,并且有一个带脚注的表格。由于表格很窄,标题文本被挤在表格宽度内,看起来很奇怪。我可以使用mincapwidth为表格环境(而不是表格本身)指定最小宽度,这解决了这个问题,但又产生了另一个问题:它也适用于脚注,由于脚注很小,所以看起来很丑陋。有没有办法让脚注遵循表格本身的宽度并忽略mincapwidth

例子:

\ctable[
caption = {Somewhat long long long caption which is long},
mincapwidth = \textwidth,
]{lr}{
  \tnote[a]{Short footnote}
}{
    \toprule
    Header 1 & Header 2 \\
    \midrule
    foo\tmark[a] & 1 \\
    \bottomrule
}

看起来像这样

最终结果

答案1

下面是一个添加新键值footerwidth(默认是表格的宽度)的解决方案:

在此处输入图片描述

\documentclass{article}
\usepackage{ctable}% http://ctan.org/pkg/ctable
\usepackage{booktabs}% http://ctan.org/pkg/booktabs
\usepackage{xpatch}% http://ctan.org/pkg/etoolbox

\makeatletter
\newdimen\@ctblfooterwidth
\define@key{ctbl}{footerwidth}{\@ctblfooterwidth=#1}
\xpatchcmd{\ctable}% <cmd>
  {{\@ctblbeg}}% <search>
  {{\ifdim\@ctblfooterwidth=0pt
     \@ctblfooterwidth\@ctblw% or \@ctblfloatwidth for default as width of float
   \fi%
   \@ctblbeg}}% <replace> {\@defaultctblmincapwidth%
  {}{}% <success><failure>
\xpatchcmd{\ctable}{\hsize}{\@ctblfooterwidth}{}{}% Patch \ctable
\xpatchcmd{\ctable}{\hsize}{\@ctblfooterwidth}{}{}% Patch \ctable
\makeatother

\begin{document}
\ctable[
caption = {Somewhat long long long caption which is long},
mincapwidth = \textwidth,
]{lr}{
  \tnote[a]{Short footnote}
}{
    \toprule
    Header 1 & Header 2 \\
    \midrule
    foo\tmark[a] & 1 \\
    \bottomrule
}

\ctable[
caption = {Somewhat long long long caption which is long},
mincapwidth = \textwidth,
footerwidth = .5\textwidth
]{lr}{
  \tnote[a]{Short footnote}
}{
    \toprule
    Header 1 & Header 2 \\
    \midrule
    foo\tmark[a] & 1 \\
    \bottomrule
}
\end{document}

xpatch提供补丁,\ctable因为它接受一个可选参数。

\@ctblfooterwidth如果新定义的维度没有长度,则第一个补丁会插入适当的定义。第二个和第三个补丁会替换 a或环境\hsize中脚注的默认宽度,如最初定义的那样。minipagetabularx\ctable

答案2

在这种情况下,我使用“穷人的ctable”:

\documentclass{article}
\usepackage{booktabs}

\makeatletter
\newsavebox{\@tabnotebox}
\providecommand\tmark{} % so having ctable or not is irrelevant
\providecommand\tnote{}
\newenvironment{tabularwithnotes}[3][c]
  {\long\def\@tabnotes{#3}%
   \renewcommand\tmark[1][a]{\makebox[0pt][l]{\textsuperscript{\itshape##1}}}%
   \renewcommand\tnote[2][a]{\textsuperscript{\itshape##1}\,##2\par}
   \begin{lrbox}{\@tabnotebox}
   \begin{tabular}{#2}}
  {\end{tabular}\end{lrbox}%
   \parbox{\wd\@tabnotebox}{
     \usebox{\@tabnotebox}\par
     \smallskip\@tabnotes
   }%
  }
\makeatother

\begin{document}
\begin{table}
\centering
\caption{Somewhat long long long caption which is long}
\medskip
\begin{tabularwithnotes}{lr}
 {
  \tnote[a]{Short footnote}
  \tnote[b]{Short footnote}
 }
\toprule
Header 1 & Header 2 \\
\midrule
foo\tmark[a] & 1\tmark[b] \\
\bottomrule
\end{tabularwithnotes}
\end{table}
\end{document}

的参数tabularwithnotes与 的相同tabular,但注释包含在一个附加参数中。

在此处输入图片描述

答案3

首先,您不应明确使用 booktabs 命令,它们是内部使用的,经过修改。使用 \FL、\ML、\LL,请参阅下面的示例文本。其次:您使用的是 ctable v1.21 或更高版本吗?

我建议引入一个选项 footerwidth,其:
- 如果不存在,则不进行任何更改(显然)
- 如果存在但没有值,则将脚注设置在表格的宽度中
- 如果存在并且有值,则将脚注设置在该值的宽度中
有什么更好的想法吗?

一个例子:

\documentclass{article}
\usepackage{ctable}
\usepackage[papersize={150mm,100mm},noheadfoot,margin=5mm]{geometry}
\pagestyle{empty}
\begin{document}

\ctable[
  caption = {Somewhat long caption, no footerwidth set},
  mincapwidth = \textwidth,
]{lr}{
  \tnote[a]{Short footnote}
}{\FL
  Header 1 & Header 2 \ML
  foo\tmark[a] & 1 \LL
}

\ctable[
  caption = {Somewhat long caption, footerwidth set, without a value},
  mincapwidth = \textwidth,
  footerwidth
]{lr}{
  \tnote[a]{Short footnote}
}{\FL
  Header 1 & Header 2 \ML
  foo\tmark[a] & 1 \LL
}

\ctable[
  caption = {Somewhat long caption, no footerwidth set to 15mm},
  mincapwidth = \textwidth,
  footerwidth = 15mm
]{lr}{
  \tnote[a]{Short footnote}
}{\FL
  Header 1 & Header 2 \ML
  foo\tmark[a] & 1 \LL
}
\end{document}

得出的结果为:

最终结果 http://wybo.xs4all.nl/ctable.png

答案4

我知道这个问题已经被问过并且得到了回答,然而,这个问题在今天仍然有意义,而且由于ctable包我认为我应该为这个问题添加我的贡献,以供未来的访问者参考。

ctablev1.26以后有一个选项footerwidth=..,可以为页脚单独指定宽度mincapwidth

我应该补充一下,它的工作原理就像Werner 在他们的回答中解释道,这样它默认排版脚注的宽度与表格宽度相同,而不管内容是什么mincapwidth。这也可以有一个参数来给它一个固定的宽度,就像你所做的那样mincapwidth,它独立于mincapwidth

因此你的代码将变成:

\ctable[
caption = {Somewhat long long long caption which is long},
mincapwidth = \textwidth,
footerwidth
]{lr}{
  \tnote[a]{Short footnote}
}{
    \toprule
    Header 1 & Header 2 \\
    \midrule
    foo\tmark[a] & 1 \\
    \bottomrule
}

添加 <code>footerwidth</code> 选项后的表格

相关内容