용어집을 먼저/후속 사용하는 메커니즘을 방해하는 캡션

용어집을 먼저/후속 사용하는 메커니즘을 방해하는 캡션

에 대한 후속 질문입니다.그림 목록의 용어집 오버플로glossaries, 패키지의 첫 번째 사용 방식을 그림 캡션의 용어집과 함께 어떻게 사용할 수 있는지 질문했습니다 . caption패키지가 로드되지 않는 한 작동하는 답변을 주었습니다 .

\documentclass{article}

\usepackage{caption}
\usepackage[colorlinks]{hyperref}
\usepackage{glossaries}

\makeglossaries
\newglossaryentry{acr}{%
  name        = {ACR-name},%
  description = {ACR-description},%
  first       = {ACR-first-description},%
}

\renewcommand{\glsdisplayfirst}[4]{#1 (1) #4}
\renewcommand{\glsdisplay}[4]{#1 (2+) #4}
\begin{document}
% \listoffigures %% even without \listoffigures the problem shows up

\begin{figure}[h]
  \caption[Short title \glshyperlink{acr}]{Long title \gls{acr}}
\end{figure}

\printglossary
\end{document}

볼 수 있듯이, caption그림 캡션이 없으면 원하는 대로 용어집 항목의 첫 번째 사용 형태가 포함되지만, 그림 캡션이 있으면 caption후속 사용 형태가 포함됩니다.

을 사용하는 동안 어떻게 계속 작동할 수 있나요 caption?

답변1

LaTeX는 캡션을 임시 스크래치 안에 넣습니다.\hbox 너비를 측정합니다. 너비가 선 너비보다 작은 경우상자캡션을 조판하는 데 재사용됩니다. 따라서 \gls한 번 호출됩니다. 그러나 캡션 너비가 줄 너비를 초과하면 캡션 텍스트가 두 번 설정되며 이번에는 단락으로 설정됩니다. 그런 다음 가 \gls두 번 호출되고 용어집 항목의 두 번째 버전에 대한 출력을 얻습니다.

패키지는 caption동작을 더 예측 가능하게 만듭니다. 옵션이 singlelinecheck설정되면(기본값) 캡션 텍스트는 항상 두 번 설정됩니다. 첫 번째는 너비를 측정하여 텍스트가 한 줄에 맞는지 확인한 다음 최종 결과를 위해 텍스트를 다시 설정합니다. 를 사용하면 singlelinecheck=false측정이 비활성화되고 텍스트가 한 번만 설정되지만 캡션 텍스트의 중심이 손실됩니다.

\gls{acr}해결 방법은 임시 상자 안에 결과를 넣고 이 상자를 내부에서 사용하는 것입니다 \caption.

\documentclass{article}

\usepackage{caption}
\usepackage{glossaries}

\newsavebox\glsscratchbox

\makeglossaries
\newglossaryentry{acr}{%
  name        = {ACR-name},%
  description = {ACR-description},%
  first       = {ACR-first-description},%
}

\renewcommand{\glsdisplayfirst}[4]{#1 (1) #4}
\renewcommand{\glsdisplay}[4]{#1 (2+) #4}
\begin{document}
\listoffigures %% even without \listoffigures the problem shows up

\begin{figure}[h]
  \sbox\glsscratchbox{\gls{acr}}
  \caption[Short title \glshyperlink{acr}]{Long title \unhcopy\glsscratchbox}
\end{figure}

\printglossary
\end{document}

(명령은 (이것은 ) \unhcopy대신 사용됩니다 . 외부 레이어를 제거하고 줄의 다른 공백과 동일한 방식으로 공백을 조판할 수 있습니다. 그렇지 않으면 ( ) 재사용된 상자 내부의 공백은 항상 자연 너비를 갖습니다. .)\usebox\copy\hbox\usebox

결과

\gls패키지 캡션 에 대한 솔루션caption

업데이트: Axel Sommerfeldt의 의견을 단순화한 내용이 추가되었습니다.

패키지는 glossaries약어의 첫 번째 사용법을 기억해야 합니다. 캡션의 너비가 측정되면 이를 비활성화하고 캡션 텍스트가 최종적으로 조판되면 비활성화하는 것이 아이디어입니다.

패키지는 caption테스트와 최종 조판 단계를 분리하기 때문에 필요합니다. 또한 측정에 앞서 호출되는 매크로를 제공하며 \caption@prepareslc, 측정 전에 호출됩니다. \glsunset일시적으로 측정이 불가능합니다 .

\documentclass{article}

\usepackage{glossaries}
\usepackage{caption}

\makeatletter
\g@addto@macro\caption@prepareslc{%
  \let\glsunset\@gobble
}
\makeatother

\makeglossaries
\newglossaryentry{acr}{%
  name        = {ACR-name},%
  description = {ACR-description},%
  first       = {ACR-first-description},%
}

\renewcommand{\glsdisplayfirst}[4]{#1 (1) #4}
\renewcommand{\glsdisplay}[4]{#1 (2+) #4}
\begin{document}
\listoffigures

\begin{figure}[h]
  \caption[Short title \glshyperlink{acr}]{Long title \gls{acr}}
\end{figure}

\printglossary
\end{document}

정제

를 사용 하는 경우 약어 사용 상태를 기억하기 위해 \gls{acr}약어에 대한 전역 플래그가 설정됩니다 . acr따라서 후속 호출에서는 더 짧은 형식을 사용할 수 있습니다. 이전 솔루션에서는 캡션 텍스트만 측정되는 경우 상태 설정을 건너뛰었습니다. 따라서 캡션 텍스트가 최종적으로 설정될 때 상태는 변경되지 않습니다.

그러나, 빠져나가는 상황이 있다. 캡션 텍스트에는 \gls첫 번째 사용법을 포함하여 동일한 약어가 여러 번 포함되어 있습니다. 그러면 이전 솔루션에는 상태 설정이 비활성화되었기 때문에 측정 단계에서 약어 사용에 대한 약어의 첫 번째 사용 형식이 포함됩니다.

이는 측정 단계에서 약어의 정상적인 상태 변경을 허용하되 첫 번째 사용법을 기억함으로써 해결됩니다. 캡션 텍스트를 최종 조판하기 전에 재설정이 있습니다.

추가 참고사항:

  • 스위치가 \if@capmeasure도입되었습니다. 일반적으로 로 설정됩니다 \iffalse. 내부에서 텍스트의 너비를 확인하면 \caption으로 설정됩니다 \iftrue.
  • 패키지는 caption테스트와 최종 조판 단계를 분리하기 때문에 필요합니다. 또한 \caption@prepareslc측정에 앞서 매크로를 제공합니다 . 둘 다 동일한 로컬 그룹에서 실행됩니다. 그러므로 \@capmeasurefalse에 추가하면 충분합니다 \caption@prepareslc. 스위치는 그룹 종료 후 자동으로 재설정됩니다.
  • 첫 번째 약어 사용 상태를 측정한 후 재설정됩니다.
  • 패키지 glossaries'는 첫 번째 약어 사용법 \glsunset의 설정을 존중하고 기억하도록 패치되었습니다 .\if@capmeasure

전체 예:

\documentclass{article}

\usepackage{glossaries}
\usepackage{caption}

\makeatletter
\newif\if@capmeasure
\g@addto@macro\caption@prepareslc{%
  \global\let\after@capmeasure\@empty
  \aftergroup\after@capmeasure
  \@capmeasuretrue
}
\CheckCommand*{\glsunset}[1]{%
  \glsdoifexists{#1}{%
    \expandafter \global \csname glo@#1@flagtrue\endcsname   
  }%
}
\renewcommand*{\glsunset}[1]{%
  \glsdoifexists{#1}{%
    \if@capmeasure
      \expandafter\ifx\csname ifglo@#1@flag\expandafter\endcsname
      \csname iftrue\endcsname
      \else 
        % first use
        \g@addto@macro\after@capmeasure{\glsreset{#1}}%
      \fi
    \fi
    \global\csname glo@#1@flagtrue\endcsname
  }%
}
\makeatother

\makeglossaries
\newglossaryentry{acr}{%
  name        = {ACR-name},%
  description = {ACR-description},%
  first       = {ACR-first-long-description},%
}

\renewcommand{\glsdisplayfirst}[4]{#1\textsuperscript{(1)}#4}
\renewcommand{\glsdisplay}[4]{#1\textsuperscript{(2+)}#4}
\begin{document}
\listoffigures

\begin{figure}[h]
  \caption[Short title \glshyperlink{acr}]%
  {Long title \textit{\gls{acr}} and \gls{acr}}
\end{figure}

\printglossary
\end{document}

개선된 결과

답변2

사용glossaries-extra 두 가지 대안이 있습니다. 보다여기.

  1. \glsxtrshort캡션 내에서 언제든지 전화할 수 있습니다 . 명백한 이유로 처음 사용이 시작되지는 않습니다. 링크도 피하고 로 생성된 용어집 목록에 이러한 항목이 표시되지 않도록 하려면 noindex및 옵션 도 있습니다 . 이는 다음과 같은 결과를 가져옵니다:hyper=false\printglossaries
  2. 이 사용법을 예측하는 데에는 명령 glossaries-extra계열이 포함됩니다 \glsfmtshort. 이는 해당 \glsxtrshort[noindex,hyper=false]명령과 동일합니다. 따라서 단수형과 복수형, 짧은 형식, 긴 형식, 전체 형식, 소문자, 첫 글자 대문자 및 완전 대문자 형식을 각각 포괄하는 몇 가지 유사한 명령이 있습니다.

관련 정보