Иногда в моем документе я хочу использовать аббревиатуру. Иногда я хочу, чтобы аббревиатура была написана с заглавной буквы (например, если она появляется в заголовке).*
*Мне нужно, чтобы это работало во всех средах, а не только в заголовках.
Варианты этого вопроса задавались по всему сайту, однако ни одно из предложенных решений на самом деле не работает. Самый близкий пример — это тот, который потребовал бы от меня переписать весь файл глоссария, чего я не хочу делать, поскольку он используется совместно с другими документами и другими людьми.
Три предложенных решения используют 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
применяет набор правил при принятии решения об изменении регистра:
- Если аргумент начинается с команды, а за этой командой следует аргумент, то к первому объекту внутреннего аргумента применяется верхний регистр.
- Если аргумент начинается с команды и за этой командой не следует аргумент, то к команде применяется верхний регистр (если только команда не является
\protect
, в этом случае она отбрасывается и правила применяются повторно). - Если аргумент не начинается с команды, то верхний регистр применяется к первому объекту в команде.
Примеры:
\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}