À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 System
e não Spaced repetition system
, ou SPACED REPETITION SYSTEM
.
Responder1
\capitialisewords
funciona aplicando-se \makefirstuc
a 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}}
.
\makefirstuc
aplica um conjunto de regras ao decidir como alterar o caso:
- 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.
- 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). - 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 \MakeUppercase
ou \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 glossaries
pacote 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 \gls
em 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 \ecapitialisewords
comocompletamenteexpande 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 \protect
e 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 \glsfetchfield
e 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 long
chave ainda está totalmente expandido. (Você pode mostrar o valor usando \showglslong{srs}
depois de definir a entrada. Isso é usado \show
no comando interno usado para armazenar o valor do long
campo.) Isso acontece porque a expansão do campo está ativada por padrão para a long
chave. 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\expandafter
que você possa fazer
\newrobustcmd*{\TCac}[1]{%
\glsfieldfetch{#1}{long}{\phrase}%
\xcapitalisewords{\phrase}%
}
A partir da glossaries
v4.22, você pode usar
\glsentrytitlecase{src}{long}
que efetivamente faz a mesma coisa que o \TCac
exemplo acima, mas o segundo argumento é o nome do campo (por exemplo, first
or text
or desc
).
Responder2
Usando titlecaps
pacote.
\documentclass{article}
\usepackage{glossaries}
\usepackage{titlecaps}
\newacronym{srs}{SRS}{spaced repetition system}
\begin{document}
\titlecap{\glsentrylong{srs}}
\end{document}
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}
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 \glsentrylong
não funciona no título da seção. A solução alternativa a seguir passa por isso, onde coloco \edef
o 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}
A stringstrings
versão é (observe a grafia de "maiúscula") fornecida abaixo. No entanto, como autor de ambos stringstrings
e titlecaps
, recomendo fortemente, em nome da eficiência, usar titlecaps
em vez de stringstrings
para esta tarefa.
\documentclass{article}
\usepackage{glossaries}
\usepackage{stringstrings}
\newacronym{srs}{SRS}{spaced repetition system}
\begin{document}
\capitalizewords{\glsentrylong{srs}}
\end{document}