tufte-latexとthreeparttableを組み合わせる

tufte-latexとthreeparttableを組み合わせる

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}instead ofを使用すると、次のようになります。\caption{Table caption}

ここに画像の説明を入力してください

これにより、キャプションは適切な場所に配置されますが、いくつかの機能が欠けています。

  1. キャプションが 1 行より短い場合は、表の上に中央揃えにします。
  2. で参照を正しく取得します\cref。(ドキュメントを数回再実行しても、この問題を解決できませんでした。)
  3. テーブルをテーブルのリストに追加します。
  4. 2 番目の引数として、テーブルのリストのキャプションの短縮形を提供する可能性。

\captiona) 既存の機能を使用して位置を上に変更する、tabularまたは b) コマンドを拡張して標準クラスと\mycaption同じように動作させる、つまり要件 1 ~ 4 を満たす方法はありますか?\caption

答え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フロートの最初のインスタンスでは、\captionとの元の定義が\labelマクロ\@tufte@orig@captionとに保存されていることがわかりました\@tufte@orig@label

環境にパッチを適用できなかったため@tufte@floatetoolbox各環境の始めに元のキャプションとラベルのコマンドを復元していましたthreeparttable

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

これにより、配置を除いて、標準クラスとまったく同じ動作 (オプションの引数が可能など) が得られます。 は標準クラスとは異なる方法でtufte-altex定義されているため、配置が異なるものと思われます。\@makecaption

この方法に奇妙な副作用があるかどうかはわかりませんが、これまでのところ私にとってはうまくいっています。

関連情報