标题首字母缩略词

标题首字母缩略词

有时我希望在文档中使用首字母缩略词。有时我希望首字母缩略词以标题大小写显示(例如,如果它出现在标题中)。*

*我需要它在所有环境中工作,而不是特定的标题。

这个问题的变体在网站上被广泛讨论,但提出的解决方案实际上都不起作用。最接近的例子是需要我重写整个词汇表文件,这是我不愿意做的事情,因为它被其他文档和其他人共享。

提出的三种解决方案使用了 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在决定如何改变大小写时应用一组规则:

  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这实际上在页面标题中效果更好,因为您不太可能希望将每个页面标题添加到条目的位置列表中,而如果您在节或章标题中使用,则可能会发生这种情况。(见为什么我不应该在 \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}%
}

glossariesv4.22 开始,你可以使用

\glsentrytitlecase{src}{long}

其实际上完成与上面示例相同的任务\TCac,但第二个参数是字段名称(例如firsttextdesc)。

答案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如下(请注意“大写”的拼写)。但是,作为和的作者stringstringstitlecaps出于效率的考虑,我强烈建议使用titlecaps而不是stringstrings来完成这项任务。

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

相关内容