结合 tufte-latex 和 threeparttable

结合 tufte-latex 和 threeparttable

我正在尝试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}

在此处输入图片描述

这样就将标题放在了正确的位置,但是缺少了一些功能:

  1. 如果标题少于一行,则将其置于表格上方居中。
  2. 正确引用\cref。(即使多次重新运行文档,也无法解决这个问题。)
  3. 将该表添加到表列表中。
  4. 可以提供表格列表标题的简短形式作为第二个参数。

有什么方法可以 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与标准类不同。

我不知道这种方法是否有任何奇怪的副作用,但到目前为止它对我有效。

相关内容