
Estou tentando threeparttable
trabalhar com a tufte-book
turma. Naturalmente, quando eu usar o seguinte a legenda será colocada na margem. Neste caso, cleveref
nã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}
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:
Isso coloca a legenda no lugar certo, mas faltam alguns recursos:
- Centralizar a legenda acima da tabela se ela for menor que uma linha.
- Acertando as referências com
\cref
. (Isso não pôde ser resolvido mesmo depois de reexecutar o documento várias vezes.) - Adicionando a tabela à lista de tabelas.
- Possibilidade de fornecer uma forma abreviada da legenda da lista de tabelas como segundo argumento.
Existe alguma maneira de a) usar a \caption
funcionalidade existente e simplesmente alterar a posição para acima tabular
ou b) estender meu \mycaption
comando para se comportar exatamente como \caption
nas 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.tex
arquivo. 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.def
Descobri que na primeira instância de um float, as definições originais de \caption
e \label
são salvas nas macros \@tufte@orig@caption
e \@tufte@orig@label
.
Como não consegui corrigir o @tufte@float
ambiente, costumava etoolbox
restaurar os comandos originais de legenda e rótulo no início de cada threeparttable
ambiente:
\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-altex
define \@makecaption
de forma diferente das classes padrão.
Não sei se esse método tem algum efeito colateral estranho, mas até agora funcionou para mim.