
Estoy tratando de ponerme threeparttable
a trabajar con la tufte-book
clase. Naturalmente, cuando uso lo siguiente, el título se colocará en el margen. En este caso, cleveref
no tiene problemas para acertar con la referencia (es decir, imprime correctamente la "Tabla"):
\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}
Ahora quiero poner el título encima de la tabla, similar al requisito enesta pregunta.
Como parece que redefinir el título no es factible, intenté crear mi propio título definiendo (como punto de partida):
\newcommand{\mycaption}[1]{\refstepcounter{table}Table~\thetable:~#1}
Usar \mycaption{Table}
en lugar de \caption{Table caption}
en el ejemplo anterior produce:
Esto coloca el título en el lugar correcto, pero faltan algunas características:
- Centrar el título encima de la tabla si tiene menos de una línea.
- Obtener las referencias correctas con
\cref
. (Esto no se pudo resolver incluso después de volver a ejecutar el documento varias veces). - Agregar la tabla a la lista de tablas.
- Posibilidad de proporcionar una forma breve del título de la lista de tablas como segundo argumento.
¿Hay alguna manera de a) usar la \caption
funcionalidad existente y simplemente cambiar la posición por encima de tabular
ob) extender mi \mycaption
comando para que se comporte como \caption
en las clases estándar, es decir, cumplir con los requisitos 1-4?
Respuesta1
EDITAR(ver a continuación la respuesta anterior):
Aquí está la versión mejorada que terminé usando. Recomiendo ponerlo en el tufte-book-local.tex
archivo. Define un "estilo de título clásico" que cumple con todos los requisitos planteados en la pregunta y activa este estilo al comienzo de cada instancia 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}
Antigua respuesta:
Cavando a travéstufte-common.def
Descubrí que en la primera instancia de un flotante, las definiciones originales de \caption
y \label
se guardan en las macros \@tufte@orig@caption
y \@tufte@orig@label
.
Como no podía parchear el @tufte@float
entorno, solía etoolbox
restaurar los comandos de título y etiqueta originales al comienzo de cada threeparttable
entorno:
\usepackage{etoolbox}
\AtBeginEnvironment{threeparttable}{%
\let\caption\@tufte@orig@caption%
\let\label\@tufte@orig@label}
\makeatother
Esto produce exactamente el mismo comportamiento que en las clases estándar (es posible un argumento opcional, etc.), excepto por la alineación. Supongo que la alineación es diferente ya que tufte-altex
se define \@makecaption
de manera diferente a las clases estándar.
No sé si este método tiene algún efecto secundario extraño, pero hasta ahora me ha funcionado.