Заглавный регистр аббревиатура

Заглавный регистр аббревиатура

Иногда в моем документе я хочу использовать аббревиатуру. Иногда я хочу, чтобы аббревиатура была написана с заглавной буквы (например, если она появляется в заголовке).*

*Мне нужно, чтобы это работало во всех средах, а не только в заголовках.

Варианты этого вопроса задавались по всему сайту, однако ни одно из предложенных решений на самом деле не работает. Самый близкий пример — это тот, который потребовал бы от меня переписать весь файл глоссария, чего я не хочу делать, поскольку он используется совместно с другими документами и другими людьми.

Три предложенных решения используют titlecaps, mfirstuc и stringstrings, однако ни одно из них не работает с аббревиатурами.

\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} 

Как сделать первую букву аббревиатуры заглавной, не изменяя глоссарий и, желательно, не включая в tex-файл огромный кусок непонятного кода?иногда?

EDIT: Для ясности я ищу способ получить Spaced Repetition Systemи не Spaced repetition system, или SPACED REPETITION SYSTEM.

решение1

\capitialisewordsработает, применяя \makefirstucк каждому разделенному пробелами элементу своего аргумента. В случае \capitalisewords{\gls{src}}, в аргументе нет пробелов, поэтому он просто делает \makefirstuc{\gls{src}}.

\makefirstucприменяет набор правил при принятии решения об изменении регистра:

  1. Если аргумент начинается с команды, а за этой командой следует аргумент, то к первому объекту внутреннего аргумента применяется верхний регистр.
  2. Если аргумент начинается с команды и за этой командой не следует аргумент, то к команде применяется верхний регистр (если только команда не является \protect, в этом случае она отбрасывается и правила применяются повторно).
  3. Если аргумент не начинается с команды, то верхний регистр применяется к первому объекту в команде.

Примеры:

  • \makefirstuc{\emph{word}}становится \emph{\uppercase word}(первый случай)
  • \makefirstuc{\oe-ligature}становится \uppercase\oe-ligature(второй случай)
  • \makefirstuc{word}становится\uppercase word

(На самом деле используется команда перевода в верхний регистр \mfirstucMakeUppercase, которую можно определить как \MakeUppercaseили \MakeTextUppercase.)

Так что \makefirstuc{\gls{src}}подходит под первый случай. Это означает, что он пытается сделать \gls{\uppercase src}. То есть, он пытается изменить регистрэтикетка.

Если фактический текст, требующий изменения регистра, скрыт внутри аргумента \makefirstuc(или \capitialisewords), то первая буква не может быть доступна. Поскольку \glsявляется надежным, его даже нельзя развернуть перед передачей в качестве аргумента. Вот почему пакет glossariesпредоставляет \Gls, поскольку изменение регистра должно выполняться глубоко внутри команды.

Я не знаю, как подобные пакеты справляются с наличием команд форматирования (таких как \emph) в тексте, в котором необходимо изменить регистр, но ни один из них не сможет получить доступ к тексту, если он встроен в надежную команду.

Единственное решение здесь — использовать один израсширяемыйтакие команды:

\documentclass{article}

\usepackage{glossaries}

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

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

На самом деле это лучше работает в заголовках страниц, так как вы вряд ли захотите добавлять каждый заголовок страницы в список местоположений для записи, что может произойти, если вы используете \glsзаголовок раздела или главы. (См.Почему мне не следует использовать команды типа \gls в \section, \chapter, \caption и т. д.?)

Конечно, вы можете определить пользовательскую команду, например:

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

или (индекс и гиперссылка)

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

Редактировать:

Будьте осторожны, используя \ecapitialisewordsего.в полной мерерасширяет аргумент, что может иметь неожиданные результаты, если текст содержит команды. Например:

\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}

На первый взгляд это похоже на случай 1 с \strong{spaced}, но полное расширение означает, что теперь он пытается сделать

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

Теперь это следует правилам: отбросить начальный вариант \protect, затем применить случай 1, что в итоге приводит к следующему:

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

что неверно. Есть два решения. Либо используйте только надежные команды:

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

или сначала извлеките значение поля и сохраните его в команде, используя \glsfetchfield, а затем примените \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}

Проблема все еще есть. Значение ключа longвсе еще полностью развернуто. (Вы можете показать значение с помощью \showglslong{srs}после определения записи. Это использует \showвнутреннюю команду, используемую для хранения значения поля long.) Это происходит, потому что расширение поля включено по умолчанию для longключа. Вы можете отключить это с помощью \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}

Теперь это работает правильно.

Обратите внимание, что \xcapitalisewordsэто сокращение для \expandafter\capitalisewords\expandafter, поэтому вы можете сделать

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

Начиная с glossariesверсии 4.22, вы можете использовать

\glsentrytitlecase{src}{long}

что фактически делает то же самое, что и \TCacпример выше, но вторым аргументом является имя поля (например, firstили textили desc).

решение2

Использование titlecapsпакета.

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

введите описание изображения здесь

Обратите внимание, что можно использовать \Addlcwords{}функцию, которая исключает определенные слова из заглавных букв. Кроме того, она автоматически скрывает (большую часть) знаков препинания и скобок при определении того, что следует писать заглавными буквами.

\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} 

введите описание изображения здесь

ДОБАВКА(РЕДАКТИРОВАНО)

Автор комментария указывает, что метод, по-видимому, не работает в заголовках разделов новый формат ACM(https://www.acm.org/publications/proceedings-template). Проблема, похоже, не в \titlecap, но это \glsentrylongне работает в заголовке раздела. Следующий обходной путь позволяет обойти его, в котором я использую \edefаббревиатуру перед ее использованием в заголовке раздела.

\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} 

введите описание изображения здесь


Версия stringstrings(обратите внимание на написание "capitalize") приведена ниже. Однако, как автор stringstringsи titlecaps, я настоятельно рекомендую, во имя эффективности, использовать , titlecapsа не stringstringsдля этой задачи.

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

Связанный контент