標題大小寫縮寫

標題大小寫縮寫

有時在我的文檔中我希望使用縮寫。有時我希望首字母縮寫詞出現在標題大小寫中(例如,如果它出現在標題中)。

*我需要它在所有環境中工作,而不是特定的標題。

整個網站上都有關於這個問題的變體詢問,但是所提出的解決方案都沒有真正起作用。最接近的例子是需要我重寫整個術語表文件,這是我不願意做的事情,因為它是由其他文件和其他人共享的。

提出的三種解決方案使用 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,但第二個參數是欄位名稱(例如firstortextdesc)。

答案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} 

相關內容