有时我希望在文档中使用首字母缩略词。有时我希望首字母缩略词以标题大小写显示(例如,如果它出现在标题中)。*
*我需要它在所有环境中工作,而不是特定的标题。
这个问题的变体在网站上被广泛讨论,但提出的解决方案实际上都不起作用。最接近的例子是需要我重写整个词汇表文件,这是我不愿意做的事情,因为它被其他文档和其他人共享。
提出的三种解决方案使用了 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 文件中包含大量难以理解的代码,我怎样才能将首字母缩略词的首字母大写有时?
编辑:为了清楚起见,我正在寻找一种方法来获取
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
这实际上在页面标题中效果更好,因为您不太可能希望将每个页面标题添加到条目的位置列表中,而如果您在节或章标题中使用,则可能会发生这种情况。(见为什么我不应该在 \section、\chapter、\caption 等中使用 \gls 之类的命令?)
当然,您可以定义自定义命令,例如:
\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
v4.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}
补充(已编辑)
OP 在评论中指出,该方法似乎不适用于 新的 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
如下(请注意“大写”的拼写)。但是,作为和的作者stringstrings
,titlecaps
出于效率的考虑,我强烈建议使用titlecaps
而不是stringstrings
来完成这项任务。
\documentclass{article}
\usepackage{glossaries}
\usepackage{stringstrings}
\newacronym{srs}{SRS}{spaced repetition system}
\begin{document}
\capitalizewords{\glsentrylong{srs}}
\end{document}