A veces en mi documento deseo utilizar un acrónimo. A veces quiero que el acrónimo aparezca en mayúsculas y minúsculas (por ejemplo, si aparece en un título).*
*Necesito que esto funcione en todos los entornos, no específicamente en títulos.
Se han planteado variantes de esta pregunta en todo el sitio, sin embargo, ninguna de las soluciones propuestas funciona realmente. El ejemplo más cercano es uno que requeriría que reescribiera todo mi archivo de glosario, algo que no estoy dispuesto a hacer, ya que lo comparten otros documentos y otras personas.
Tres soluciones propuestas utilizan titlecaps, mfirstuc y stringstrings, sin embargo, ninguna de ellas funciona con acrónimos.
\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}
Sin tener que modificar mi glosario, y preferiblemente sin tener que incluir una enorme cantidad de código impenetrable en mi archivo tex, ¿cómo puedo poner en mayúscula la primera letra de un acrónimo?a veces?
EDITAR: Para mayor claridad, estoy buscando una manera de obtener
Spaced Repetition System
y no Spaced repetition system
, o SPACED REPETITION SYSTEM
.
Respuesta1
\capitialisewords
funciona aplicando \makefirstuc
a cada elemento separado por espacios de su argumento. En el caso de \capitalisewords{\gls{src}}
, no hay espacios en el argumento, por lo que simplemente los tiene \makefirstuc{\gls{src}}
.
\makefirstuc
aplica un conjunto de reglas al decidir cómo cambiar el caso:
- Si el argumento comienza con un comando y ese comando va seguido de un argumento, entonces las mayúsculas se aplican al primer objeto del argumento interno.
- Si el argumento comienza con un comando y ese comando no va seguido de un argumento, entonces las mayúsculas se aplican al comando (a menos que el comando sea
\protect
, en cuyo caso se descarta y se vuelven a aplicar las reglas). - Si el argumento no comienza con un comando, entonces las mayúsculas se aplican al primer objeto del comando.
Ejemplos:
\makefirstuc{\emph{word}}
se convierte en\emph{\uppercase word}
(primer caso)\makefirstuc{\oe-ligature}
se convierte en\uppercase\oe-ligature
(segundo caso)\makefirstuc{word}
se convierte\uppercase word
(El comando en mayúsculas utilizado es en realidad \mfirstucMakeUppercase
, que puede definirse como \MakeUppercase
o \MakeTextUppercase
).
Así \makefirstuc{\gls{src}}
se incluye en el primer caso. Esto significa que intenta hacerlo \gls{\uppercase src}
. Es decir, intenta cambiar el caso de laetiqueta.
Si el texto que realmente requiere el cambio de mayúsculas y minúsculas está oculto dentro del argumento de \makefirstuc
(o \capitialisewords
), no se puede acceder a la primera letra. Dado que \gls
es robusto, ni siquiera se puede expandir antes de pasarlo como argumento. Es por eso que el glossaries
paquete proporciona \Gls
, porque el cambio de mayúsculas y minúsculas debe realizarse en lo más profundo del interior del comando.
No sé cómo manejan paquetes similares la presencia de comandos de formato (como \emph
) dentro del texto que necesita cambiarse entre mayúsculas y minúsculas, pero ninguno de ellos podrá acceder al texto si está incrustado dentro de un comando robusto.
La única solución aquí es utilizar uno de losampliablecomandos como este:
\documentclass{article}
\usepackage{glossaries}
\newacronym{srs}{SRS}{spaced repetition system}
\begin{document}
\ecapitalisewords{\glsentrylong{srs}}
\end{document}
En realidad, esto funciona mejor en los encabezados de página, ya que es poco probable que desee que cada encabezado de página se agregue a la lista de ubicaciones para la entrada, que es lo que puede suceder si lo usa \gls
en el encabezado de una sección o capítulo. (Ver¿Por qué no debería usar comandos como \gls en \section, \chapter, \caption, etc.?)
Por supuesto, puede definir un comando personalizado, como por ejemplo:
\newcommand*{\TCac}[1]{\ecapitalisewords{\glsentrylong{#1}}}
o (índice e hipervínculo)
\newcommand*{\iTCac}[2][]{\glsdisp[#1]{#2}{\ecapitalisewords{\glsentrylong{#2}}}}
Editar:
Tenga cuidado al usarlo \ecapitialisewords
comocompletamenteexpande el argumento, lo que puede tener resultados inesperados si el texto contiene comandos. Por ejemplo:
\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}
Esto superficialmente se parece al caso 1 con \strong{spaced}
, pero la expansión completa significa que ahora está intentando hacer
\capitialisewords{\protect\leavevmode{\protect\color{red}\protect\textbf{spaced}} repetition system}
Esto ahora sigue las reglas: descartar inicial \protect
, luego aplicar el caso 1, que termina como
\leavevmode{\uppercase\protect\color{red}\protect\textbf{spaced}}
lo cual es incorrecto. Hay dos soluciones. Utilice únicamente comandos robustos:
\newrobustcmd*{\strong}[1]{\textcolor{red}{\textbf{#1}}}
o primero busque el valor del campo y guárdelo en un comando usando \glsfetchfield
y luego 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}
Todavía hay un problema aquí. El valor de la long
clave todavía está completamente ampliado. (Puede mostrar el valor usando \showglslong{srs}
después de definir la entrada. Esto usa \show
el comando interno usado para almacenar el valor del long
campo). Esto sucede porque la expansión del campo está activada de manera predeterminada para la long
clave. Puedes desactivar esto 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}
Esto ahora funciona correctamente.
Tenga en cuenta que \xcapitalisewords
es un atajo para \expandafter\capitalisewords\expandafter
que pueda hacer
\newrobustcmd*{\TCac}[1]{%
\glsfieldfetch{#1}{long}{\phrase}%
\xcapitalisewords{\phrase}%
}
A partir de glossaries
v4.22, puedes usar
\glsentrytitlecase{src}{long}
que efectivamente hace lo mismo que el \TCac
ejemplo anterior, pero el segundo argumento es el nombre del campo (por ejemplo, first
o text
o desc
).
Respuesta2
Usando titlecaps
paquete.
\documentclass{article}
\usepackage{glossaries}
\usepackage{titlecaps}
\newacronym{srs}{SRS}{spaced repetition system}
\begin{document}
\titlecap{\glsentrylong{srs}}
\end{document}
Tenga en cuenta que se puede utilizar la \Addlcwords{}
función que excluye palabras específicas de estar en mayúsculas. Además, enmascara automáticamente (la mayoría) la puntuación y los corchetes al determinar qué poner en mayú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)
El OP indica en un comentario que el método no parece funcionar en los títulos de las secciones de el nuevo formato ACM(https://www.acm.org/publications/proceedings-template). El problema parece no estar en \titlecap
, pero eso \glsentrylong
no funciona en el encabezado de la sección. La siguiente solución permite solucionarlo, en la que escribo \edef
el acrónimo antes de usarlo en el encabezado de la sección.
\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}
La stringstrings
versión es (tenga en cuenta la ortografía de "mayúscula") que se muestra a continuación. Sin embargo, como autor de ambos stringstrings
y titlecaps
, recomiendo encarecidamente, en nombre de la eficiencia, utilizarlo titlecaps
en lugar de hacerlo stringstrings
para esta tarea.
\documentclass{article}
\usepackage{glossaries}
\usepackage{stringstrings}
\newacronym{srs}{SRS}{spaced repetition system}
\begin{document}
\capitalizewords{\glsentrylong{srs}}
\end{document}