Сочетание тафты-латекса и трехкомпонентного

Сочетание тафты-латекса и трехкомпонентного

Я пытаюсь приступить к 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. Возможность предоставления краткой формы заголовка для списка таблиц в качестве второго аргумента.

Есть ли способ а) использовать существующую \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иначе, чем стандартные классы.

Я не знаю, есть ли у этого метода какие-то странные побочные эффекты, но пока мне он помогает.

Связанный контент