我正在使用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
中脚注的默认宽度,如最初定义的那样。minipage
tabularx
\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}
得出的结果为:
答案4
我知道这个问题已经被问过并且得到了回答,然而,这个问题在今天仍然有意义,而且由于ctable
包我认为我应该为这个问题添加我的贡献,以供未来的访问者参考。
从ctable
v1.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
}