我正在尝试threeparttable
使用该类tufte-book
。当然,当我使用以下内容时,标题将放在页边距中。在这种情况下,cleveref
正确引用没有任何问题(即它正确打印了“表格”):
\documentclass{tufte-book}
\usepackage{threeparttable}
\usepackage{cleveref}
\begin{document}
\begin{table}
\centering
\begin{threeparttable}
\caption{Table caption}
\begin{tabular}{cc}
Some & tabular \\
Contents & \ldots
\end{tabular}
\end{threeparttable}
\label{tab:foo}
\end{table}
See \cref{tab:foo}.
\end{document}
现在我想把标题放在表格上方,类似于这个问题。
由于重新定义标题似乎不可行,我尝试通过定义(作为起点)来推出我自己的标题:
\newcommand{\mycaption}[1]{\refstepcounter{table}Table~\thetable:~#1}
在上面的例子中使用\mycaption{Table}
而不是得到的结果为:\caption{Table caption}
这样就将标题放在了正确的位置,但是缺少了一些功能:
- 如果标题少于一行,则将其置于表格上方居中。
- 正确引用
\cref
。(即使多次重新运行文档,也无法解决这个问题。) - 将该表添加到表列表中。
- 可以提供表格列表标题的简短形式作为第二个参数。
有什么方法可以 a) 使用现有\caption
功能并简单地将位置更改为上方tabular
或 b) 扩展我的\mycaption
命令以使其像\caption
在标准类中一样运行,即满足要求 1-4?
答案1
编辑(请参阅下面的旧答案):
这是我最终使用的改进版本。我建议将其放入文件中tufte-book-local.tex
。它定义了一个“经典标题样式”,满足问题中提出的所有要求,并在每个实例的开头激活此样式threeparttable
:
\RequirePackage{etoolbox}
\makeatletter
\newif\if@tufte@margtab\@tufte@margtabfalse
\AtBeginEnvironment{margintable}{\@tufte@margtabtrue}
\AtEndEnvironment{margintable}{\@tufte@margtabfalse}
\newcommand{\classiccaptionstyle}{%
\long\def\@caption##1[##2]##3{%
\par
\addcontentsline{\csname ext@##1\endcsname}{##1}%
{\protect\numberline{\csname the##1\endcsname}{\ignorespaces ##2}}%
\begingroup
\@parboxrestore
\if@minipage
\@setminipage
\fi
\normalsize
\@makecaption{\csname fnum@##1\endcsname}{\ignorespaces ##3}\par
\endgroup}
\long\def\@makecaption##1##2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{\@tufte@caption@font##1: ##2}%
\ifdim \wd\@tempboxa >\hsize
\@tufte@caption@font\if@tufte@margtab\@tufte@caption@justification\fi##1: ##2\par
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip}
% \setcaptionfont{\normalfont}
\let\caption\@tufte@orig@caption%
\let\label\@tufte@orig@label}
\makeatother
\AtBeginEnvironment{threeparttable}{%
\classiccaptionstyle}
旧答案:
挖掘tufte-common.def
我发现在浮点数的第一个实例中,\caption
和的原始定义\label
保存在宏\@tufte@orig@caption
和中\@tufte@orig@label
。
由于我无法修补@tufte@float
环境,因此我习惯etoolbox
在每个环境开始时恢复原始的标题和标签命令threeparttable
:
\usepackage{etoolbox}
\AtBeginEnvironment{threeparttable}{%
\let\caption\@tufte@orig@caption%
\let\label\@tufte@orig@label}
\makeatother
除了对齐之外,这会产生与标准类完全相同的行为(可选参数可能等)。我推测对齐是不同的,因为它的tufte-altex
定义\@makecaption
与标准类不同。
我不知道这种方法是否有任何奇怪的副作用,但到目前为止它对我有效。