Bildunterschrift stört den Mechanismus der Erst-/Folgeverwendung im Glossar

Bildunterschrift stört den Mechanismus der Erst-/Folgeverwendung im Glossar

Dies ist eine Folgefrage zuGlossare im Abbildungsverzeichnis Überlauf, wo gefragt wurde, wie das erste Verwendungsschema des glossariesPakets mit einem Glossarbegriff in einer Bildunterschrift verwendet werden kann. Ich habe eine Antwort gegeben, die funktioniert, solange das captionPaket nicht geladen ist.

\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}

Wie man sieht, ist ohne captiondie Bildunterschrift wie gewünscht die erste Verwendungsform des Glossareintrags enthalten, mit jedoch captiondie nachfolgende Verwendungsform.

Wie kann ich dafür sorgen, dass es während der Verwendung funktioniert caption?

Antwort1

LaTeX legt die Überschrift in einen temporären Kratzer \hboxund misst dessen Breite. Wenn die Breite kleiner als die Zeilenbreite ist,Kastenwird wiederverwendet, um die Überschrift zu setzen. Daher \glswird es einmal aufgerufen. Wenn die Überschrift jedoch breiter als die Zeilenbreite ist, wird der Überschriftentext zweimal gesetzt, dieses Mal als Absatz. Dann \glswird es zweimal aufgerufen und Sie erhalten die Ausgabe für die zweite Version des Glossareintrags.

Das Paket captionmacht das Verhalten vorhersehbarer. Wenn die Option singlelinecheckgesetzt ist (Standard), wird der Beschriftungstext immer zweimal gesetzt, das erste Mal zum Messen der Breite, um zu prüfen, ob der Text in eine Zeile passt, und dann wird der Text für das Endergebnis erneut gesetzt. Mit singlelinecheck=falsewird die Messung deaktiviert und der Text nur einmal gesetzt, aber die Zentrierung des Beschriftungstextes geht verloren.

Eine Problemumgehung besteht darin, das Ergebnis \gls{acr}in eine temporäre Box zu setzen und diese Box darin zu verwenden \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}

(Der Befehl \unhcopywird anstelle von \usebox(dies ist ein \copy) verwendet. Er entfernt die äußere \hboxEbene und ermöglicht den Satz der Leerzeichen auf die gleiche Weise wie die anderen Leerzeichen in der Zeile. Andernfalls ( \usebox) hat der Abstand innerhalb des wiederverwendeten Felds immer die natürliche Breite.)

Ergebnis

Lösung für \glsin der Beschriftung mit Paketcaption

Update: Vereinfachung aus Axel Sommerfeldts Kommentar hinzugefügt.

Das Paket glossariesmuss sich die erste Verwendung der Akronyme merken. Die Idee ist, dies zu deaktivieren, wenn die Breite der Beschriftung gemessen wird, aber nicht, wenn der Beschriftungstext endgültig gesetzt wird.

Das Paket captionwird benötigt, da es den Test vom abschließenden Satzschritt trennt. Außerdem stellt es ein Makro bereit \caption@prepareslc, das der Messung vorangeht und vor der Messung aufgerufen wird. Es \glsunsetist für die Messung vorübergehend deaktiviert.

\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}

Raffinesse

Bei \gls{acr}Verwendung wird ein globales Flag für das Akronym gesetzt, acrum den Status der Akronymverwendung zu speichern. Somit können nachfolgende Aufrufe die kürzere Form verwenden. Die vorherige Lösung übersprang die Statussetzung, wenn der Beschriftungstext nur gemessen wurde. Dadurch hat sich der Status nicht geändert, wenn der Beschriftungstext endgültig gesetzt wird.

Es gibt jedoch eine Situation, die durchrutscht. Der Beschriftungstext enthält \glsdasselbe Akronym mehrmals, einschließlich seiner ersten Verwendung. Dann würde die vorherige Lösung die erste Verwendungsform des Akronyms für die Verwendungen des Akronyms im Messschritt enthalten, da die Statuseinstellung dort deaktiviert wurde.

Dies wird dadurch behoben, dass die normalen Zustandsänderungen der Akronyme im Messschritt zugelassen werden, die ersten Verwendungen jedoch gemerkt werden. Diese werden anschließend vor dem endgültigen Setzen des Beschriftungstextes zurückgesetzt.

Weitere Bemerkungen:

  • Ein Schalter \if@capmeasurewird eingeführt. Normalerweise ist er auf eingestellt \iffalse. Wenn die Breite des Textes innerhalb überprüft wird \caption, wird er auf eingestellt \iftrue.
  • Das Paket captionwird benötigt, da es den Test vom abschließenden Satzschritt trennt. Außerdem stellt es ein Makro bereit, \caption@prepareslcdas der Messung vorangeht. Beide werden in derselben lokalen Gruppe ausgeführt. Daher reicht es aus, zu hinzuzufügen \@capmeasurefalse. \caption@prepareslcDer Schalter wird nach dem Ende der Gruppe automatisch zurückgesetzt.
  • Nach der Messung wird der Status der ersten Akronymverwendungen zurückgesetzt.
  • Das Paket glossaries„“ \glsunsetwurde gepatcht, um die Einstellung zu respektieren \if@capmeasureund sich die Verwendung erster Akronyme zu merken.

Vollständiges Beispiel:

\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}

Ergebnis mit Verfeinerung

Antwort2

Mit glossaries-extrahaben Sie zwei Alternativen. SieheHier.

  1. Sie können immer \glsxtrshortinnerhalb von Untertiteln aufrufen. Diese lösen aus offensichtlichen Gründen keine erste Verwendung aus. Sie haben auch die Optionen noindexund hyper=false, wenn Sie auch Links vermeiden möchten und nicht möchten, dass diese Einträge in einer mit erstellten Glossarliste erscheinen \printglossaries. Was uns zu folgendem bringt:
  2. Um diese Verwendung vorherzusagen, glossaries-extraist die Befehlsfamilie enthalten \glsfmtshort. Diese sind identisch mit den entsprechenden \glsxtrshort[noindex,hyper=false]Befehlen. Sie haben also mehrere ähnliche Befehle, die jeweils Singular- und Pluralformen, Kurz-, Lang- und Vollbuchstaben sowie Kleinbuchstaben, Großbuchstaben des ersten Buchstabens und vollständige Großbuchstaben abdecken.

verwandte Informationen