Combinando tufo-látex e três partes

Combinando tufo-látex e três partes

Estou tentando threeparttabletrabalhar com a tufte-bookturma. Naturalmente, quando eu usar o seguinte a legenda será colocada na margem. Neste caso, cleverefnão tem problemas em acertar a referência (ou seja, imprime corretamente a "Tabela"):

\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}

insira a descrição da imagem aqui

Agora quero colocar a legenda acima da tabela, semelhante ao requisito emessa questão.

Como parece que redefinir a legenda não é viável, tentei rolar minha própria legenda definindo (como ponto de partida):

\newcommand{\mycaption}[1]{\refstepcounter{table}Table~\thetable:~#1}

Usar \mycaption{Table}em vez de \caption{Table caption}no exemplo acima produz:

insira a descrição da imagem aqui

Isso coloca a legenda no lugar certo, mas faltam alguns recursos:

  1. Centralizar a legenda acima da tabela se ela for menor que uma linha.
  2. Acertando as referências com \cref. (Isso não pôde ser resolvido mesmo depois de reexecutar o documento várias vezes.)
  3. Adicionando a tabela à lista de tabelas.
  4. Possibilidade de fornecer uma forma abreviada da legenda da lista de tabelas como segundo argumento.

Existe alguma maneira de a) usar a \captionfuncionalidade existente e simplesmente alterar a posição para acima tabularou b) estender meu \mycaptioncomando para se comportar exatamente como \captionnas classes padrão, ou seja, atender aos requisitos 1-4?

Responder1

EDITAR(veja abaixo a resposta antiga):

Aqui está a versão melhorada que acabei usando. Eu recomendo colocá-lo no tufte-book-local.texarquivo. Ele define um "estilo de legenda clássico" que atende a todos os requisitos colocados na questão e ativa esse estilo no início de cada instância de 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}

Resposta antiga:

Cavandotufte-common.defDescobri que na primeira instância de um float, as definições originais de \captione \labelsão salvas nas macros \@tufte@orig@captione \@tufte@orig@label.

Como não consegui corrigir o @tufte@floatambiente, costumava etoolboxrestaurar os comandos originais de legenda e rótulo no início de cada threeparttableambiente:

    \usepackage{etoolbox}
    \AtBeginEnvironment{threeparttable}{%
        \let\caption\@tufte@orig@caption%
        \let\label\@tufte@orig@label}
    \makeatother

Isso produz exatamente o mesmo comportamento das classes padrão (argumento opcional possível, etc.), exceto pelo alinhamento. Presumo que o alinhamento seja diferente, pois tufte-altexdefine \@makecaptionde forma diferente das classes padrão.

Não sei se esse método tem algum efeito colateral estranho, mas até agora funcionou para mim.

informação relacionada