Esta é uma pergunta de acompanhamentoGlossários na lista de figuras estouram, onde foi questionado como o primeiro esquema de utilização do glossaries
pacote pode ser utilizado com um termo do glossário na legenda de uma figura. Dei uma resposta que funciona desde que o caption
pacote não esteja carregado.
\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 pode ser visto, sem caption
a legenda da figura contém a primeira forma de uso da entrada do glossário conforme desejado, mas com caption
ela está a forma de uso subsequente.
Como posso manter isso funcionando enquanto uso caption
?
Responder1
LaTeX coloca a legenda dentro de um arranhão temporário \hbox
e mede sua largura. Se a largura for menor que a largura da linha, ocaixaé reutilizado para compor a legenda. Portanto \gls
é chamado uma vez. No entanto, se a largura da legenda exceder a largura da linha, o texto da legenda será definido duas vezes, desta vez como parágrafo. Então \gls
é chamado duas vezes e você obtém a saída para a segunda versão do item do glossário.
O pacote caption
torna o comportamento mais previsível. Se a opção singlelinecheck
estiver definida (padrão), então o texto da legenda é sempre definido duas vezes, a primeira vez para medir a largura para verificar se o texto cabe em uma linha e depois o texto é definido novamente para o resultado final. Com singlelinecheck=false
, a medição é desativada e o texto é definido apenas uma vez, mas a centralização do texto da legenda se perde.
Uma solução alternativa é colocar o resultado \gls{acr}
dentro de uma caixa temporária e usar esta caixa 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}
(O comando \unhcopy
é usado em vez de \usebox
(este é um \copy
). Ele remove a \hbox
camada externa e permite que os espaços sejam digitados da mesma forma que os outros espaços na linha. Caso contrário ( \usebox
) o espaço dentro da caixa reutilizada sempre terá a largura natural .)
Solução para \gls
na legenda com pacotecaption
Atualização: Adicionada simplificação do comentário de Axel Sommerfeldt.
O pacote glossaries
deve lembrar os primeiros usos das siglas. A ideia é desabilitar isso, se a largura da legenda for medida, mas não, se o texto da legenda for finalmente composto.
O pacote caption
é necessário porque separa o teste da etapa final de composição. Também fornece macro \caption@prepareslc
que precede a medição e é chamada antes da medição. Está \glsunset
temporariamente desativado para medição.
\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}
Refinamento
Se \gls{acr}
for usado, um sinalizador global será definido para o acrônimo acr
para lembrar o estado de uso do acrônimo. Assim, as chamadas subsequentes podem usar a forma mais curta. A solução anterior ignorou a configuração do estado, se o texto da legenda for medido apenas. Assim, o estado não mudou quando o texto da legenda foi finalmente definido.
No entanto, há uma situação que escapa. O texto da legenda contém \gls
a mesma sigla várias vezes, incluindo seu primeiro uso. Então a solução anterior conteria a primeira forma de uso do acrônimo para os usos do acrônimo na etapa de medição, porque a configuração do estado foi desabilitada lá.
Isto é corrigido permitindo as mudanças normais de estado das siglas na etapa de medição, mas lembrando os primeiros usos. São redefinidos posteriormente, antes da composição tipográfica final do texto da legenda.
Observações adicionais:
- Um switch
\if@capmeasure
é introduzido. Normalmente está definido como\iffalse
. Quando a largura do texto é verificada internamente\caption
, ela é definida como\iftrue
. - O pacote
caption
é necessário porque separa o teste da etapa final de composição. Também fornece macro\caption@prepareslc
que precede a medição. Ambos são executados no mesmo grupo local. Portanto, basta\@capmeasurefalse
adicionar\caption@prepareslc
. A chave é reiniciada automaticamente após o término do grupo. - Após a medição, o estado dos primeiros usos da sigla é redefinido.
- O pacote
glossaries
'\glsunset
foi corrigido para respeitar a configuração\if@capmeasure
e lembrar os primeiros usos do acrônimo.
Exemplo 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}
Responder2
Usando glossaries-extra
você tem duas alternativas. Veraqui.
- Você sempre pode ligar
\glsxtrshort
nas legendas. Estes não irão desencadear a primeira utilização, por razões óbvias. Você também tem as opçõesnoindex
ehyper=false
, se quiser evitar links e não quiser que essas entradas apareçam em uma lista de glossário criada com\printglossaries
. O que nos leva a: - Prever esse uso
glossaries-extra
inclui a família de\glsfmtshort
comandos. Eles são idênticos aos\glsxtrshort[noindex,hyper=false]
comandos correspondentes. Portanto, você tem vários comandos semelhantes, abrangendo cada uma das formas singulares e plurais, formas curtas, longas e completas, além de letras minúsculas, primeira letra maiúscula e formas maiúsculas completas.