legenda interferindo no mecanismo de uso primeiro/subsequente dos glossários

legenda interferindo no mecanismo de uso primeiro/subsequente dos glossários

Esta é uma pergunta de acompanhamentoGlossários na lista de figuras estouram, onde foi questionado como o primeiro esquema de utilização do glossariespacote pode ser utilizado com um termo do glossário na legenda de uma figura. Dei uma resposta que funciona desde que o captionpacote 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 captiona legenda da figura contém a primeira forma de uso da entrada do glossário conforme desejado, mas com captionela 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 \hboxe 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 captiontorna o comportamento mais previsível. Se a opção singlelinecheckestiver 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 \hboxcamada 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 .)

Resultado

Solução para \glsna legenda com pacotecaption

Atualização: Adicionada simplificação do comentário de Axel Sommerfeldt.

O pacote glossariesdeve 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@prepareslcque precede a medição e é chamada antes da medição. Está \glsunsettemporariamente 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 acrpara 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 \glsa 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@prepareslcque precede a medição. Ambos são executados no mesmo grupo local. Portanto, basta \@capmeasurefalseadicionar \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' \glsunsetfoi corrigido para respeitar a configuração \if@capmeasuree 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}

Resultado com requinte

Responder2

Usando glossaries-extravocê tem duas alternativas. Veraqui.

  1. Você sempre pode ligar \glsxtrshortnas legendas. Estes não irão desencadear a primeira utilização, por razões óbvias. Você também tem as opções noindexe hyper=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:
  2. Prever esse uso glossaries-extrainclui a família de \glsfmtshortcomandos. 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.

informação relacionada