
Я пытаюсь приступить к 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
. (Эту проблему не удалось решить даже после многократного повторного запуска документа.) - Добавление таблицы в список таблиц.
- Возможность предоставления краткой формы заголовка для списка таблиц в качестве второго аргумента.
Есть ли способ а) использовать существующую \caption
функциональность и просто изменить положение так, чтобы она находилась над tabular
или б) расширить мою \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
Я обнаружил, что при первом появлении float исходные определения \caption
и \label
сохраняются в макросах \@tufte@orig@caption
и \@tufte@orig@label
.
Поскольку я не мог исправить @tufte@float
среду, я etoolbox
восстанавливал исходные команды caption и label в начале каждой threeparttable
среды:
\usepackage{etoolbox}
\AtBeginEnvironment{threeparttable}{%
\let\caption\@tufte@orig@caption%
\let\label\@tufte@orig@label}
\makeatother
Это дает точно такое же поведение, как в стандартных классах (возможен необязательный аргумент и т. д.), за исключением выравнивания. Я предполагаю, что выравнивание отличается, поскольку tufte-altex
определяет \@makecaption
иначе, чем стандартные классы.
Я не знаю, есть ли у этого метода какие-то странные побочные эффекты, но пока мне он помогает.