我正在制作一个包含两个子表的表,每个子表都有自己的表注释,因此我使用 threeparttable。但是系统提示我出现以下错误:
! Package caption Error: table inside subtable.
See the caption package documentation for explanation.
Type H for immediate help.
...
l.7 \begin{threeparttable}
If you do not understand this error, please take a closer look
at the documentation of the `caption' package, especially the
section about errors.
这是我的代码的一个小例子。它给出了上面的错误。我搜索了一下,似乎threeparttable
应该能够使用subcaption
,至少在我这里的简单示例中是这样。你们中有人遇到过类似的问题吗?可以给我指点一下吗?谢谢。
\documentclass{article}
\usepackage{threeparttable}
\usepackage{subcaption}
\begin{document}
\begin{table}
\begin{subtable}{\textwidth}
\begin{threeparttable}
\begin{tabular}{ccc}
test1 &test1 &test1
\end{tabular}
\end{threeparttable}
\end{subtable}
\end{table}
\end{document}
更新 1
感谢@cfr的回答,如果我们把 放在threeparttable
外面subtable
,编译错误就会消失。但是我们这里有新的问题。让我们首先明确我们想要什么:
- 我们想要一个
table
,这意味着它有一个主标题(Tab 1
)。 - 在这个顶层里面
table
,我们需要两个子表,这些子表是否由标签实现subtable
并不重要。 - 对于每个子表,它都有自己的标题(
Tab a
和Tab b
)和表格注释。
因此现在我们面临以下问题:
\documentclass{article}
\usepackage{threeparttable}
\usepackage{subcaption}
\begin{document}
\begin{table}
\centering
\caption{top level caption}
\begin{threeparttable}
\centering
\caption{sub level caption 1}
\begin{subtable}{\textwidth}
\begin{tabular}{|c|c|c|}
\hline
test1 &test1 &test1\\
\hline
\end{tabular}
\end{subtable}
\end{threeparttable}
\begin{threeparttable}
\centering
\caption{sub level caption 2}
\begin{subtable}{\textwidth}
\begin{tabular}{|c|c|c|}
\hline
test2 &test2 &test2\\
\hline
\end{tabular}
\end{subtable}
\end{threeparttable}
\end{table}
\end{document}
\documentclass{article}
\usepackage{threeparttable}
\usepackage{subcaption}
\begin{document}
\begin{table}
\centering
\caption{top level caption}
\begin{threeparttable}
\centering
\begin{subtable}{\textwidth}
\caption{sub level caption 1}
\begin{tabular}{|c|c|c|}
\hline
test1 &test1 &test1\\
\hline
\end{tabular}
\end{subtable}
\end{threeparttable}
\begin{threeparttable}
\centering
\begin{subtable}{\textwidth}
\caption{sub level caption 2}
\begin{tabular}{|c|c|c|}
\hline
test2 &test2 &test2\\
\hline
\end{tabular}
\end{subtable}
\end{threeparttable}
\end{table}
\end{document}
答案1
问题在于,caption
包重新定义了threeparttable
环境以将标题类型设置为table
。caption
使用标题类型检查是否存在不适当的嵌套。在这种情况下,table
当在subtable
环境中时,它会发现尝试将标题类型设置为。它知道这是不允许的,所以它会给出错误。
最简单的解决方案,特别是如果你的一些threeparttable
一些不是类型的,是利用将 放入中subtable
时可以正常工作的事实。或者,您可以只在环境中设置标题类型,而根本不使用环境。subtable
threeparttable
threeparttable
subtable
但是,正如您的更新所指出的,这很遗憾地重新启动了每个子表的计数器。这里有一个可以避免这种困难的解决方案。
请注意,这里的想法是,您可以具体更改 的选项threepartsubtable
,就像您可以更改 的选项一样threeparttable
。我认为一定有一种更优雅的方法可以做到这一点,但尚未找到。
也就是说,我只有很少的线索……
买者自负。
[根据评论进行了编辑,但并不完全符合评论内容。]
\documentclass{article}
\usepackage{threeparttable}
\usepackage{subcaption}
\makeatletter
\newcommand\threepart@subtable{% based on code modified from caption.sty
\caption@setoptions{threepartsubtable}%
\caption@ORI@threeparttable
}
\newenvironment{threepartsubtable}{%
\threepart@subtable
}{%
\endthreeparttable
}
\makeatother
\captionsetup[threepartsubtable]{subtype}
\begin{document}
\begin{table}
\centering
\caption{Standard main caption}
\begin{subtable}{\textwidth}
\caption{Caption}
\begin{tabular}{cc}
a & b
\end{tabular}
\end{subtable}
\end{table}
\begin{table}
\centering
\caption{Main caption}
\begin{threepartsubtable}
\caption{Caption}
\begin{tabular}{ccc}
test 1 & test 1 & test 1
\end{tabular}
\end{threepartsubtable}
\begin{threepartsubtable}
\caption{Caption}
\begin{tabular}{ccc}
test 2 & test 2 & test 2
\end{tabular}
\end{threepartsubtable}
\begin{threepartsubtable}
\caption{Caption}
\begin{tabular}{ccc}
test 3 & test 3 & test 3
\end{tabular}
\end{threepartsubtable}
\begin{threepartsubtable}
\caption{Caption}
\begin{tabular}{ccc}
test 4 & test 4 & test 4
\end{tabular}
\end{threepartsubtable}
\end{table}
\begin{table}
\centering
\caption{Another main caption}
\begin{threepartsubtable}
\caption{Caption}
\begin{tabular}{ccc}
test 5 & test 5 & test 5
\end{tabular}
\end{threepartsubtable}
\begin{threepartsubtable}
\caption{Caption}
\begin{tabular}{ccc}
test 6 & test 6 & test 6
\end{tabular}
\end{threepartsubtable}
\end{table}
\end{document}