el título interfiere con el mecanismo de uso primero/posterior del glosario

el título interfiere con el mecanismo de uso primero/posterior del glosario

Esta es una pregunta de seguimiento sobreSe desbordan los glosarios en la Lista de figurasglossaries, donde se preguntó cómo se puede utilizar el primer esquema de uso del paquete con un término del glosario en el título de una figura. Di una respuesta que funciona siempre que el captionpaquete no esté cargado.

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

Como puede verse, sin captionel título de la figura contiene la primera forma de uso de la entrada del glosario según se desee, pero con captionella está la forma de uso posterior.

¿Cómo puedo seguir funcionando mientras lo uso caption?

Respuesta1

LaTeX coloca el título dentro de un rasguño temporal \hboxy mide su ancho. Si el ancho es menor que el ancho de la línea, elcajase reutiliza para componer el título. Por eso \glsse llama una vez. Sin embargo, si el ancho del título excede el ancho de la línea, el texto del título se establece dos veces, esta vez como párrafo. Luego \glsse llama dos veces y se obtiene el resultado de la segunda versión del elemento del glosario.

El paquete captionhace que el comportamiento sea más predecible. Si la opción singlelinecheckestá configurada (predeterminada), entonces el texto del título siempre se configura dos veces, la primera vez para medir el ancho para verificar si el texto cabe en una línea y luego el texto se configura nuevamente para el resultado final. Con singlelinecheck=false, la medición se desactiva y el texto solo se configura una vez, pero se pierde el centrado del texto del título.

Una solución alternativa es poner el resultado \gls{acr}dentro de un cuadro temporal y usar este cuadro dentro \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}

(El comando \unhcopyse usa en lugar de \usebox(este es un \copy). Elimina la \hboxcapa exterior y permite que los espacios se escriban de la misma manera que los otros espacios en la línea. De lo contrario ( \usebox) el espacio dentro del cuadro reutilizado siempre tendrá el ancho natural. .)

Resultado

Solución para \glsen el título con paquetecaption

Actualización: Se agregó una simplificación del comentario de Axel Sommerfeldt.

El paquete glossariesdebe recordar los primeros usos de las siglas. La idea es deshabilitar esto, si se mide el ancho del título, pero no, si el texto del título finalmente se compone.

El paquete captiones necesario porque separa la prueba del paso final de composición tipográfica. También proporciona una macro \caption@prepareslcque precede a la medición y se llama antes de la medición. Está \glsunsettemporalmente deshabilitado para la medición.

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

Refinamiento

Si \gls{acr}se utiliza, se establece una marca global para el acrónimo acrpara recordar el estado de uso del acrónimo. Por tanto, las llamadas posteriores pueden utilizar la forma más corta. La solución anterior omitió la configuración del estado, si el texto del título solo se mide. Por lo tanto, el estado no ha cambiado cuando finalmente se establece el texto del título.

Sin embargo, hay una situación que se escapa. El texto del título contiene \glsel mismo acrónimo varias veces, incluido su primer uso. Entonces, la solución anterior contendría la primera forma de uso del acrónimo para los usos del acrónimo en el paso de medición, porque la configuración de estado se ha deshabilitado allí.

Esto se soluciona permitiendo los cambios de estado normales de las siglas en el paso de medición, pero recordando los primeros usos. Se restablecen posteriormente antes de la composición tipográfica final del texto del título.

Más observaciones:

  • \if@capmeasureSe introduce un interruptor . Normalmente está configurado en \iffalse. Cuando se marca el ancho del texto en el interior \caption, se establece en \iftrue.
  • El paquete captiones necesario porque separa la prueba del paso final de composición tipográfica. También proporciona macro \caption@prepareslcque precede a la medición. Ambos se ejecutan en el mismo grupo local. Por lo tanto basta con \@capmeasurefalseañadir \caption@prepareslc. El interruptor se reinicia automáticamente después del final del grupo.
  • Después de la medición, se restablece el estado de los usos de las primeras siglas.
  • El paquete glossaries' \glsunsetestá parcheado para respetar la configuración \if@capmeasurey recordar los primeros usos de las siglas.

Ejemplo completo:

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

Resultado con refinamiento

Respuesta2

Usando glossaries-extratienes dos alternativas. Veraquí.

  1. Siempre puedes llamar \glsxtrshortdentro de los subtítulos. Estos no desencadenarán el primer uso, por razones obvias. También tienes las opciones noindexy hyper=false, si también quieres evitar enlaces y no quieres que estas entradas aparezcan en una lista del Glosario creada con \printglossaries. Lo que nos lleva a:
  2. La predicción de este uso glossaries-extraincluye la familia de \glsfmtshortcomandos. Estos son idénticos a los \glsxtrshort[noindex,hyper=false]comandos correspondientes. Por lo tanto, tiene varios comandos similares, que cubren cada una de las formas singular y plural, formas cortas, largas y completas, y formas minúsculas, mayúsculas de primera letra y mayúsculas completas.

información relacionada