Título caso um acrônimo

Título caso um acrônimo

Às vezes, em meu documento, desejo usar uma sigla. Às vezes quero que o acrônimo apareça em letras maiúsculas (por exemplo, se aparecer em um título).*

*Preciso que isso funcione em todos os ambientes, não especificamente em títulos.

Variantes desta questão foram feitas em todo o site, mas nenhuma das soluções propostas realmente funciona. O exemplo mais próximo é aquele que exigiria que eu reescrevesse todo o meu arquivo de glossário, algo que não estou disposto a fazer, pois ele é compartilhado por outros documentos e outras pessoas.

Três soluções propostas usam titlecaps, mfirstuc e stringstrings, porém nenhuma delas funciona em siglas.

\documentclass{article}
\usepackage{glossaries}
\usepackage{titlecaps}
\usepackage{mfirstuc}
\usepackage{stringstrings}

\newacronym{srs}{SRS}{spaced repetition system}

\begin{document}
  \titlecap{\gls{srs}}
  \capitalisewords{\gls{srs}}
  \capitalizetitle{\gls{srs}}
\end{document} 

Sem ter que modificar meu glossário, e de preferência sem ter que incluir uma enorme quantidade de código impenetrável em meu arquivo tex, como posso colocar a primeira letra de uma sigla em maiúsculaàs vezes?

EDITAR: Para maior clareza, estou procurando uma maneira de obter Spaced Repetition Systeme não Spaced repetition system, ou SPACED REPETITION SYSTEM.

Responder1

\capitialisewordsfunciona aplicando-se \makefirstuca cada elemento separado por espaço de seu argumento. No caso de \capitalisewords{\gls{src}}, não há espaços no argumento, então simplesmente existe \makefirstuc{\gls{src}}.

\makefirstucaplica um conjunto de regras ao decidir como alterar o caso:

  1. Se o argumento começar com um comando e esse comando for seguido por um argumento, então as letras maiúsculas serão aplicadas ao primeiro objeto do argumento interno.
  2. Se o argumento começar com um comando e esse comando não for seguido por um argumento, então a letra maiúscula será aplicada ao comando (a menos que o comando seja \protect, caso em que será descartado e as regras serão reaplicadas).
  3. Se o argumento não começar com um comando, as letras maiúsculas serão aplicadas ao primeiro objeto do comando.

Exemplos:

  • \makefirstuc{\emph{word}}torna-se \emph{\uppercase word}(primeiro caso)
  • \makefirstuc{\oe-ligature}torna-se \uppercase\oe-ligature(segundo caso)
  • \makefirstuc{word}torna-se\uppercase word

(O comando de letras maiúsculas usado é, na verdade \mfirstucMakeUppercase, , que pode ser definido como \MakeUppercaseou \MakeTextUppercase.)

Então \makefirstuc{\gls{src}}vem no primeiro caso. Isso significa que ele tenta fazer \gls{\uppercase src}. Ou seja, tenta mudar o caso dorótulo.

Se o texto que realmente requer mudança de maiúsculas e minúsculas estiver oculto no argumento de \makefirstuc(ou \capitialisewords), a primeira letra não poderá ser acessada. Como \glsé robusto, não pode nem ser expandido antes de ser passado como argumento. É por isso que o glossariespacote fornece \Gls, porque a mudança de maiúsculas e minúsculas deve ser realizada profundamente no interior do comando.

Não sei como pacotes semelhantes lidam com a presença de comandos de formatação (como \emph) dentro do texto que precisa ter sua caixa alterada, mas nenhum deles será capaz de acessar o texto se ele estiver incorporado em um comando robusto.

A única solução aqui é usar um dosexpansívelcomandos como este:

\documentclass{article}

\usepackage{glossaries}

\newacronym{srs}{SRS}{spaced repetition system}

\begin{document}
  \ecapitalisewords{\glsentrylong{srs}}
\end{document}

Na verdade, isso funciona melhor em títulos de página, pois é improvável que você queira que cada cabeçalho de página seja adicionado à lista de locais da entrada, que é o que pode acontecer se você usar \glsem um título de seção ou capítulo. (VerPor que não devo usar comandos como \gls em \section, \chapter, \caption etc?)

Você pode, é claro, definir um comando personalizado, como:

\newcommand*{\TCac}[1]{\ecapitalisewords{\glsentrylong{#1}}}

ou (índice e hiperlink)

\newcommand*{\iTCac}[2][]{\glsdisp[#1]{#2}{\ecapitalisewords{\glsentrylong{#2}}}}

Editar:

Tome cuidado ao usar \ecapitialisewordscomocompletamenteexpande o argumento, o que pode ter resultados inesperados se o texto contiver comandos. Por exemplo:

\documentclass{article}

\usepackage{xcolor}
\usepackage{glossaries}

\newcommand*{\strong}[1]{\textcolor{red}{\textbf{#1}}}

\newacronym{srs}{SRS}{\strong{spaced} repetition system}

\newcommand*{\TCac}[1]{\ecapitalisewords{\glsentrylong{#1}}}

\begin{document}

\TCac{srs}.

\end{document}

Isso se parece superficialmente com o caso 1 \strong{spaced}, mas a expansão completa significa que agora ele está tentando fazer

\capitialisewords{\protect\leavevmode{\protect\color{red}\protect\textbf{spaced}}  repetition system}

Agora segue as regras: descarte inicial \protecte aplique o caso 1, que termina como

\leavevmode{\uppercase\protect\color{red}\protect\textbf{spaced}}

o que está incorreto. Existem duas soluções. Use apenas comandos robustos:

\newrobustcmd*{\strong}[1]{\textcolor{red}{\textbf{#1}}}

ou primeiro busque o valor do campo e armazene-o em um comando usando \glsfetchfielde depois aplique \capitialisewords:

\documentclass{article}

\usepackage{xcolor}
\usepackage{glossaries}

\newcommand*{\strong}[1]{\textcolor{red}{\textbf{#1}}}

\newacronym{srs}{SRS}{\strong{spaced} repetition system}

\newrobustcmd*{\TCac}[1]{%
 \glsfieldfetch{#1}{long}{\phrase}%
 \expandafter\capitalisewords\expandafter{\phrase}%
}

\begin{document}

\TCac{srs}.

\end{document}

Ainda há um problema aqui. O valor da longchave ainda está totalmente expandido. (Você pode mostrar o valor usando \showglslong{srs}depois de definir a entrada. Isso é usado \showno comando interno usado para armazenar o valor do longcampo.) Isso acontece porque a expansão do campo está ativada por padrão para a longchave. Você pode desligar isso usando \glsnoexpandfields:

\documentclass{article}

\usepackage{xcolor}
\usepackage{glossaries}

\glsnoexpandfields

\newcommand*{\strong}[1]{\textcolor{red}{\textbf{#1}}}

\newacronym{srs}{SRS}{\strong{spaced} repetition system}

\newrobustcmd*{\TCac}[1]{%
 \glsfieldfetch{#1}{long}{\phrase}%
 \expandafter\capitalisewords\expandafter{\phrase}%
}

\begin{document}

\TCac{srs}.

\end{document}

Isso agora funciona corretamente.

Observe que \xcapitalisewordsé um atalho para \expandafter\capitalisewords\expandafterque você possa fazer

\newrobustcmd*{\TCac}[1]{%
 \glsfieldfetch{#1}{long}{\phrase}%
 \xcapitalisewords{\phrase}%
}

A partir da glossariesv4.22, você pode usar

\glsentrytitlecase{src}{long}

que efetivamente faz a mesma coisa que o \TCacexemplo acima, mas o segundo argumento é o nome do campo (por exemplo, firstor textor desc).

Responder2

Usando titlecapspacote.

\documentclass{article}
\usepackage{glossaries}
\usepackage{titlecaps}
\newacronym{srs}{SRS}{spaced repetition system}
\begin{document}
\titlecap{\glsentrylong{srs}}
\end{document} 

insira a descrição da imagem aqui

Observe que é possível usar o \Addlcwords{}recurso que exclui palavras específicas de serem maiúsculas. Além disso, ele mascara automaticamente (a maioria) da pontuação e dos colchetes ao descobrir o que colocar em maiúscula.

\documentclass{article}
\usepackage{glossaries}
\usepackage{titlecaps}
\newacronym{srs}{SRS}{spaced repetition, of an (ocular) system}
\begin{document}
\titlecap{\glsentrylong{srs}}

\Addlcwords{an of}
\titlecap{\glsentrylong{srs}}
\end{document} 

insira a descrição da imagem aqui

SUPLEMENTO(EDITADO)

O OP indica em um comentário que o método não parece funcionar nos títulos das seções de o novo formato ACM(https://www.acm.org/publications/proceedings-template). O problema parece não ser \titlecap, mas isso \glsentrylongnão funciona no título da seção. A solução alternativa a seguir passa por isso, onde coloco \edefo acrônimo antes de usá-lo no título da seção.

\documentclass{sig-alternate-05-2015}
\usepackage{glossaries}
\usepackage{titlecaps}
\Addlcwords{an of}
\newacronym{srs}{SRS}{spaced repetition, of an (ocular) system}
\begin{document}
\edef\tmp{\glsentrylong{srs}}
\section{This is  \expandafter\titlecap\expandafter{\tmp} ok? }
\titlecap{\glsentrylong{srs}}
\end{document} 

insira a descrição da imagem aqui


A stringstringsversão é (observe a grafia de "maiúscula") fornecida abaixo. No entanto, como autor de ambos stringstringse titlecaps, recomendo fortemente, em nome da eficiência, usar titlecapsem vez de stringstringspara esta tarefa.

\documentclass{article}
\usepackage{glossaries}
\usepackage{stringstrings}
\newacronym{srs}{SRS}{spaced repetition system}
\begin{document}
\capitalizewords{\glsentrylong{srs}}
\end{document} 

informação relacionada