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}대신 사용하면 다음과 같은 결과가 나옵니다.\caption{Table caption}

여기에 이미지 설명을 입력하세요

이렇게 하면 캡션이 올바른 위치에 배치되지만 일부 기능이 누락되었습니다.

  1. 캡션이 한 줄보다 짧은 경우 표 위 중앙에 캡션을 배치합니다.
  2. 를 사용하여 참조를 올바르게 가져옵니다 \cref. (문서를 여러번 재실행해도 해결되지 않았습니다.)
  3. 테이블 목록에 테이블을 추가합니다.
  4. 두 번째 인수로 테이블 목록에 대한 짧은 형식의 캡션을 제공할 수 있습니다.

\captiona) 기존 기능을 사용하고 단순히 위치를 위의 위치로 변경하거나 tabularb) 표준 클래스에서처럼 \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했습니다 .etoolboxthreeparttable

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

이는 정렬을 제외하고 표준 클래스(선택적 인수 가능 등)와 정확히 동일한 동작을 생성합니다. 표준 클래스와 다르게 tufte-altex정의하기 때문에 정렬이 다르다고 가정합니다 .\@makecaption

이 방법에 이상한 부작용이 있는지는 모르겠지만 지금까지는 효과가 있었습니다.

관련 정보