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