캡션 패키지가 threeparttablex 패키지와 호환되지 않습니까?

캡션 패키지가 threeparttablex 패키지와 호환되지 않습니까?

나는 다음과 같은 것을 성취하려고 노력하고 있습니다 : 하이퍼링크가 있는 테이블의 각주

다른 용도로 필요한 캡션 패키지를 함께 사용하는 것을 제외하고. 두 가지 접근 방식은 서로 잘 맞지 않는 것 같고 이를 해결하는 방법을 알 수 없는 것 같습니다. 내가받는 경고는 다음과 같습니다.

패키지 캡션 경고: 입력 라인 32에 \label적절한 항목이 없습니다 \caption. 설명은 캡션 패키지 설명서를 참조하세요.

그리고 참조가 해결되지 않습니다(그 자리에 ??가 표시됩니다). 항목 \caption에 대한 이전 항목을 추가하려고 하면 기본적으로 내 캡션 글꼴의 동일한 테이블에 여러 캡션을 추가하려고 시도합니다.\label\tnotex

\documentclass[letterpaper]{article}

% This package allows for footnoting within tables
\usepackage{enumitem,booktabs,cfr-lm}
\usepackage{tabularx}
\usepackage[referable]{threeparttablex}
\renewlist{tablenotes}{enumerate}{1}
\makeatletter
\setlist[tablenotes]{label=\tnote{\alph*}, ref=\alph*, itemsep=\z@, topsep=\z@skip, partopsep=\z@skip,parsep=\z@,itemindent=\z@,labelindent=\tabcolsep,labelsep=.2em,leftmargin=*,align=left,before={\footnotesize}}
\makeatother

\usepackage{caption}

\begin{document}

\begin{table}[ht]       
    \centering            
    \begin{threeparttable}  
        \begin{tabular}{|l|c|c|}
            \hline
            A & 1 & 2 \tnote{1} \\
            \hline
            B & 2 & 1 \\
            \hline
            C & 3\tnotex{tn:2} & 3 \\
            \hline
            Line & producing & space. \\
            \hline
        \end{tabular}
        \begin{tablenotes}
            \item[1] This is the first note.
            \item[2] \label{tn:2} This is the hyperlinked note.
        \end{tablenotes}      
    \end{threeparttable}
    \caption{A table caption.}
\end{table}% 

\end{document}

캡션 패키지 없이도 잘 작동하지만 문서에서 캡션 글꼴과 색상을 설정하는 데 이 패키지를 사용합니다. 해결 방법을 아는 사람이 있나요?

답변1

패키지세 부분으로 된 테이블x잔뜩세 부분으로 나눌 수 있는질문에 링크된 답변을 포함하여 다른 답변에서 분명히 알 수 있듯이 tablenotes사용할 수 있는 표준 환경을 사용자 정의하는 데 사용할 수 tabular있으며 다른 답변에서 제안한 대로 사용에만 국한되지 않습니다 longtable.

사실, 당신이 가지고 있는 코드는 몇 가지 사소한 변경만으로 제게는 잘 작동합니다. tablenotes활성화하도록 재정의하고 있습니다.자동적 인열거하지만 하드 코딩된 레이블로 이를 재정의합니다. 이것은 말이 되지 않습니다. 권장되지 않지만 모범 사례가 아닌 아라비아 숫자를 마커로 사용하려면 사용자 정의를 tablenotes적절하게 변경하십시오.

\setlist[tablenotes]{label=\tnote{\arabic*}, ref=\arabic*, itemsep=0pt, topsep=0pt, partopsep=0pt ,parsep=0pt, itemindent=0pt, labelindent=\tabcolsep, labelsep=.2em, leftmargin=*, align=left, before={\footnotesize}}

그리고 나서 쓰세요

    \begin{tablenotes}
      \item This is the first note.
      \item \label{tn:2} This is the hyperlinked note.
    \end{tablenotes}

글쓰기 등을 선호한다면 애초에 환경을 \item[1]재정의하지 마세요 .tablenotes

이러한 변경 사항과 을 추가하면 \usepackage{hyperref}하이퍼링크 노트가 제대로 작동합니다.

하이퍼링크된 테이블노트

전체 코드:

\documentclass[letterpaper]{article}
\usepackage{enumitem,cfr-lm}% you aren't using booktabs
\usepackage{tabularx}
\usepackage[referable]{threeparttablex}
\renewlist{tablenotes}{enumerate}{1}
\setlist[tablenotes]{label=\tnote{\arabic*}, ref=\arabic*, itemsep=0pt, topsep=0pt, partopsep=0pt ,parsep=0pt, itemindent=0pt, labelindent=\tabcolsep, labelsep=.2em, leftmargin=*, align=left, before={\footnotesize}}

\usepackage{hyperref}
\usepackage{caption}

\begin{document}
\begin{table}[ht]
  \centering
  \begin{threeparttable}
    \begin{tabular}{|l|c|c|}
      \hline
      A & 1 & 2 \tnote{1} \\
      \hline
      B & 2 & 1 \\
      \hline
      C & 3\tnotex{tn:2} & 3 \\
      \hline
      Line & producing & space. \\
      \hline
    \end{tabular}
    \begin{tablenotes}
      \item This is the first note.
      \item \label{tn:2} This is the hyperlinked note.
    \end{tablenotes}
  \end{threeparttable}
  \caption{A table caption.}
\end{table}
\end{document}

답변2

우선, 이것은~ 아니다caption와 패키지 사이의 비호환성 threeparttablex. 패키지 caption는 여기서 뭔가 잘못되고 있다는 힌트만 제공하며 이는 맞습니다.

\item하지만 먼저 LaTeX2e 자체에서 제공하는 기본 구현부터 시작해 보겠습니다 .

\def\@item[#1]{%
  ...
  \if@noitemarg
    \@noitemargfalse
    \if@nmbrlist
      \refstepcounter\@listctr
    \fi
  \fi
  ...}

여기서 볼 수 있듯이 목록에 번호가 매겨져 있고 선택적 인수 없이 사용된 경우 \item에만 참조(나중에 사용할 수 있음)를 생성합니다 . 그래서 특히 그럴 것이다\ļabel\item\item[2]~ 아니다\label및 에서 사용할 수 있는 참조를 생성합니다 \ref. (이것은 Leslie Lamport가 내린 디자인 결정인 것 같습니다.)

예시 문서:

\documentclass{article}

\begin{document}

\ref{item1} \ref{item2}

\begin{enumerate}
\item \label{item1} Text
\item[2] \label{item2} Text
\end{enumerate}

\end{document}

없이 선택적 인수만 참조를 생성하므로 둘 다 여기에 \ref출력됩니다 1( 및 는 아님 1) 2. 따라서 둘 다 실제로는 선택적 인수 없이 생성된 동일한 참조를 사용하고 있습니다 .\item\label\item

패키지는 (내부에서만 ) threeparttablex재정의하므로 (정의를 통해) 참조를 생성합니다 : [1]\itemtablenotes\item[2]\@currentlabel

\renewcommand\tablenotes{%
  \let\TPTL@item=\item
  \renewcommand\item[1][]{\TPTL@item[##1]%
    \phantomsection\protected@edef\@currentlabel{##1}}
  ...}

예시 문서:

\documentclass[letterpaper]{article}
\usepackage[referable]{threeparttablex}

\begin{document}

\begin{table}[ht]
    \centering
    \begin{threeparttable}
        \begin{tabular}{|l|c|c|}
            \hline
            A & 1 & 2 \tnote{1} \\
            \hline
            B & 2 & 1 \\
            \hline
            C & 3 \tnotex{tn:2} & 3 \\
            \hline
            Line & producing & space. \\
            \hline
        \end{tabular}
        \begin{tablenotes}
            \item[1] This is the first note.
            \item[2] \label{tn:2} This is the hyperlinked note.
        \end{tablenotes}
    \end{threeparttable}
    \caption{A table caption.}
\end{table}

\end{document}

결과는 양호하며 예상한 대로 \tnotex{tn:2}결과가 생성됩니다 2. (참고: 여기에 문제 없이 패키지 사용법을 추가할 수 있습니다 caption.)

\renewlist{tablenotes}이제 패키지 에서 제공하는 사용법을 추가하겠습니다 enumitem.

\documentclass[letterpaper]{article}
\usepackage[referable]{threeparttablex}

\usepackage{enumitem}
\renewlist{tablenotes}{enumerate}{1}

\begin{document}

\begin{table}[ht]
    \centering
    \begin{threeparttable}
        \begin{tabular}{|l|c|c|}
            \hline
            A & 1 & 2 \tnote{1} \\
            \hline
            B & 2 & 1 \\
            \hline
            C & 3 \tnotex{tn:2} & 3 \\
            \hline
            Line & producing & space. \\
            \hline
        \end{tabular}
        \begin{tablenotes}
            \item[1] This is the first note.
            \item[2] \label{tn:2} This is the hyperlinked note.
        \end{tablenotes}
    \end{threeparttable}
    \caption{A table caption.}
\end{table}

\end{document}

죄송합니다. 2이제 사라졌습니다. 무슨 일이 일어난?

대신 일반 환경을 사용하도록 환경을 \renewlist{tablenotes}{enumerate}{1}재정의합니다 . 위에서 알 수 있듯이 일반 환경에서는 사용을 위한 참조가 전혀 생성되지 않으므로 실제로 참조를 생성하는 기능이 제거됩니다 . 따라서 이제 참조를 생성한 마지막 명령에 의해 생성된 참조를 선택합니다. 그러나 아무 것도 없으므로 출력은 단순히 비어 있습니다. 를 추가하면 다음과 같은 내용이 표시됩니다.tablenotesenumerate\item[2]enumerate\labelthreeparttablex\item[xxx]\label{tn:2}\section

\documentclass[letterpaper]{article}
\usepackage[referable]{threeparttablex}

\usepackage{enumitem}
\renewlist{tablenotes}{enumerate}{1}

\begin{document}

\section{Test}  % <= This line added

\begin{table}[ht]
    \centering
    \begin{threeparttable}
        \begin{tabular}{|l|c|c|}
            \hline
            A & 1 & 2 \tnote{1} \\
            \hline
            B & 2 & 1 \\
            \hline
            C & 3 \tnotex{tn:2} & 3 \\
            \hline
            Line & producing & space. \\
            \hline
        \end{tabular}
        \begin{tablenotes}
            \item[1] This is the first note.
            \item[2] \label{tn:2} This is the hyperlinked note.
        \end{tablenotes}
    \end{threeparttable}
    \caption{A table caption.}
\end{table}

\end{document}

이제 (아직) 이 (첫 번째) 섹션을 가리 키지 않기 때문에 (예상되는 대신 ) \tnotex{tn:2}을 생성합니다 .12\label{tn:2}\item[2]

그런데 왜 cfr에서 제공하는 예제 문서가 올바른 출력을 제공합니까? 선택적 인수 없이 사용하기 때문에 \item위에서 알 수 있듯이 이는 항상 적절한 참조를 생성합니다.

이제 이야기의 마지막 부분입니다. 패키지 caption가 이 모든 것과 무슨 관련이 있습니까?

글쎄, 패키지에는 , 등 내에서 적절한 참조 없이 caption감지하는 기능이 있습니다 . 그리고 이것이 바로 여기서 문제이기 때문에 이 기능이 발생합니다.\labelfiguretablethreeparttable

caption그러나 여기서 패키지 가 제공하는 경고 메시지의 내용은 오해의 소지가 있음을 고백합니다 . 나는 "적절한 \caption이 없는 \label"이라는 텍스트를 선택했는데, 이는 일반적으로 여기서는 \label행간이 없는 \caption것이 문제이기 때문입니다. 다음 버전에서는 기술적으로 보다 정확한 "\label Without a 적절한 참조" 텍스트로 변경할 예정입니다.

[1] 이것은 패키지의 문서화된 기능입니다 threeparttablex: "패키지 옵션 »referable«을 사용하여 (a) \item[...]에 의해 발행된 수동으로 지정된 메모 마커가 참조 가능하도록 몇 가지 세 부분으로 구성된 내부를 변경합니다. 그리고 ..." ( threeparttablex문서에서 발췌, 2014년 5월 22일 기준)

답변3

내 해결 방법은 아마도 정확히 당신이 찾고 있던 것이 아니지만 각주가 있는 테이블의 경우 환경을 사용하고 지정된 테이블 너비로 tabularx각주를 최종 열에 넣는 것이 좋은 솔루션이라고 생각합니다 . p또한 테이블의 전체 너비를 사용하려면 인라인 열거를 각주로 사용하는 것이 좋습니다. 매크로는 \tabref참조의 모양을 사용자 정의하는 데 사용됩니다. 종합해보면:

\documentclass[letterpaper]{article}

\usepackage[inline]{enumitem}
\usepackage{booktabs,cfr-lm,tabularx,ragged2e}
\usepackage{caption,hyperref}
\captionsetup[table]{position=top,aboveskip=6pt}

\newcommand*{\tabref}[1]{\textsuperscript{\ref{#1}}}

\begin{document}

\begin{table}[ht]
  \centering
  \captionbox{A table caption made somewhat longer to see the
    effect\label{tab:example}}{%
    \begin{tabularx}{0.5\textwidth}{@{}c>{\hfil}X<{\hfil}c@{}}
      \toprule
      Line & producing & space \\
      \midrule
      A & 1 & 2\tabref{tn:1} \\
      B & 2 & 1 \\
      C & 3\tabref{tn:2} & 3 \\
      \bottomrule
      \multicolumn{3}{@{}p{0.5\textwidth}@{}}{\RaggedRight
        \begin{enumerate*}
        \item  This is the first note.\label{tn:1}
        \item  This is the hyperlinked note\label{tn:2}.
        \end{enumerate*}%
      }%
    \end{tabularx}%
  }%
\end{table}

\end{document}

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

관련 정보