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 caption
paquete 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 caption
el título de la figura contiene la primera forma de uso de la entrada del glosario según se desee, pero con caption
ella 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 \hbox
y mide su ancho. Si el ancho es menor que el ancho de la línea, elcajase reutiliza para componer el título. Por eso \gls
se 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 \gls
se llama dos veces y se obtiene el resultado de la segunda versión del elemento del glosario.
El paquete caption
hace que el comportamiento sea más predecible. Si la opción singlelinecheck
está 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 \unhcopy
se usa en lugar de \usebox
(este es un \copy
). Elimina la \hbox
capa 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. .)
Solución para \gls
en el título con paquetecaption
Actualización: Se agregó una simplificación del comentario de Axel Sommerfeldt.
El paquete glossaries
debe 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 caption
es necesario porque separa la prueba del paso final de composición tipográfica. También proporciona una macro \caption@prepareslc
que precede a la medición y se llama antes de la medición. Está \glsunset
temporalmente 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 acr
para 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 \gls
el 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@capmeasure
Se 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
caption
es necesario porque separa la prueba del paso final de composición tipográfica. También proporciona macro\caption@prepareslc
que precede a la medición. Ambos se ejecutan en el mismo grupo local. Por lo tanto basta con\@capmeasurefalse
añ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
'\glsunset
está parcheado para respetar la configuración\if@capmeasure
y 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}
Respuesta2
Usando glossaries-extra
tienes dos alternativas. Veraquí.
- Siempre puedes llamar
\glsxtrshort
dentro de los subtítulos. Estos no desencadenarán el primer uso, por razones obvias. También tienes las opcionesnoindex
yhyper=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: - La predicción de este uso
glossaries-extra
incluye la familia de\glsfmtshort
comandos. 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.