有時在我的文檔中我希望使用縮寫。有時我希望首字母縮寫詞出現在標題大小寫中(例如,如果它出現在標題中)。
*我需要它在所有環境中工作,而不是特定的標題。
整個網站上都有關於這個問題的變體詢問,但是所提出的解決方案都沒有真正起作用。最接近的例子是需要我重寫整個術語表文件,這是我不願意做的事情,因為它是由其他文件和其他人共享的。
提出的三種解決方案使用 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
ortext
或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}