
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 行より短い場合は、表の上に中央揃えにします。
- で参照を正しく取得します
\cref
。(ドキュメントを数回再実行しても、この問題を解決できませんでした。) - テーブルをテーブルのリストに追加します。
- 2 番目の引数として、テーブルのリストのキャプションの短縮形を提供する可能性。
\caption
a) 既存の機能を使用して位置を上に変更する、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@float
、etoolbox
各環境の始めに元のキャプションとラベルのコマンドを復元していましたthreeparttable
。
\usepackage{etoolbox}
\AtBeginEnvironment{threeparttable}{%
\let\caption\@tufte@orig@caption%
\let\label\@tufte@orig@label}
\makeatother
これにより、配置を除いて、標準クラスとまったく同じ動作 (オプションの引数が可能など) が得られます。 は標準クラスとは異なる方法でtufte-altex
定義されているため、配置が異なるものと思われます。\@makecaption
この方法に奇妙な副作用があるかどうかはわかりませんが、これまでのところ私にとってはうまくいっています。