
나는 수업 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
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
나는 float의 첫 번째 인스턴스에서 \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
이 방법에 이상한 부작용이 있는지는 모르겠지만 지금까지는 효과가 있었습니다.