Manchmal möchte ich in meinem Dokument ein Akronym verwenden. Manchmal möchte ich, dass das Akronym in Groß- und Kleinschreibung erscheint (zum Beispiel, wenn es in einem Titel vorkommt).*
*Ich brauche, dass dies in allen Umgebungen funktioniert, nicht unbedingt in Titeln.
Varianten dieser Frage wurden auf der gesamten Site gestellt, aber keine der vorgeschlagenen Lösungen funktioniert wirklich. Das am nächsten kommende Beispiel wäre eines, das erfordern würde, dass ich meine gesamte Glossardatei neu schreibe, was ich aber nicht tun möchte, da sie von anderen Dokumenten und anderen Personen gemeinsam genutzt wird.
Drei vorgeschlagene Lösungen verwenden Titlecaps, Mfirstuc und Stringstrings, allerdings funktioniert keine davon mit Akronymen.
\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}
Wie kann ich den ersten Buchstaben eines Akronyms groß schreiben, ohne mein Glossar ändern zu müssen und vorzugsweise ohne einen riesigen Haufen undurchdringlichen Code in meine Tex-Datei einzufügen?Manchmal?
BEARBEITEN: Der Klarheit halber suche ich nach einer Möglichkeit , Spaced Repetition System
und nicht Spaced repetition system
oder zu erhalten SPACED REPETITION SYSTEM
.
Antwort1
\capitialisewords
funktioniert, indem es \makefirstuc
auf jedes durch Leerzeichen getrennte Element seines Arguments angewendet wird. Im Fall von \capitalisewords{\gls{src}}
gibt es keine Leerzeichen im Argument, also wird einfach ausgeführt \makefirstuc{\gls{src}}
.
\makefirstuc
wendet bei der Entscheidung, wie die Groß-/Kleinschreibung geändert werden soll, eine Reihe von Regeln an:
- Wenn das Argument mit einem Befehl beginnt und auf diesen Befehl ein Argument folgt, wird die Großschreibung auf das erste Objekt des inneren Arguments angewendet.
- Wenn das Argument mit einem Befehl beginnt und auf diesen Befehl kein Argument folgt, wird die Großschreibung auf den Befehl angewendet (es sei denn, der Befehl ist
\protect
; in diesem Fall wird er verworfen und die Regeln werden erneut angewendet). - Wenn das Argument nicht mit einem Befehl beginnt, wird die Großschreibung auf das erste Objekt im Befehl angewendet.
Beispiele:
\makefirstuc{\emph{word}}
wird\emph{\uppercase word}
(erster Fall)\makefirstuc{\oe-ligature}
wird\uppercase\oe-ligature
(zweiter Fall)\makefirstuc{word}
wird\uppercase word
(Der verwendete Großbuchstabenbefehl ist tatsächlich , was als oder \mfirstucMakeUppercase
definiert werden kann .)\MakeUppercase
\MakeTextUppercase
Fällt also \makefirstuc{\gls{src}}
unter den ersten Fall. Das bedeutet, dass es versucht, zu tun \gls{\uppercase src}
. Das heißt, es versucht, den Fall desEtikett.
Wenn der eigentliche Text, bei dem die Groß-/Kleinschreibung geändert werden muss, im Argument von \makefirstuc
(oder \capitialisewords
) versteckt ist, kann auf den ersten Buchstaben nicht zugegriffen werden. Da \gls
robust ist, kann es nicht einmal erweitert werden, bevor es als Argument übergeben wird. Aus diesem Grund glossaries
stellt das Paket bereit \Gls
, da die Groß-/Kleinschreibung tief im Inneren des Befehls geändert werden muss.
Ich weiß nicht, wie ähnliche Pakete mit dem Vorhandensein von Formatierungsbefehlen (wie z. B. \emph
) innerhalb des Textes umgehen, bei denen die Groß-/Kleinschreibung geändert werden muss, aber keines davon kann auf den Text zugreifen, wenn dieser in einen robusten Befehl eingebettet ist.
Die einzige Lösung besteht hier in der Verwendung eines dererweiterbarBefehle wie diese:
\documentclass{article}
\usepackage{glossaries}
\newacronym{srs}{SRS}{spaced repetition system}
\begin{document}
\ecapitalisewords{\glsentrylong{srs}}
\end{document}
Dies funktioniert eigentlich besser bei Seitenüberschriften, da Sie wahrscheinlich nicht möchten, dass jede Seitenüberschrift zur Standortliste für den Eintrag hinzugefügt wird, was jedoch passieren kann, wenn Sie sie \gls
in einer Abschnitts- oder Kapitelüberschrift verwenden. (SieheWarum sollte ich Befehle wie \gls nicht in \section, \chapter, \caption usw. verwenden?)
Sie können natürlich einen benutzerdefinierten Befehl definieren, beispielsweise:
\newcommand*{\TCac}[1]{\ecapitalisewords{\glsentrylong{#1}}}
oder (Index und Hyperlink)
\newcommand*{\iTCac}[2][]{\glsdisp[#1]{#2}{\ecapitalisewords{\glsentrylong{#2}}}}
Bearbeiten:
Seien Sie vorsichtig bei der Verwendung \ecapitialisewords
,völligerweitert das Argument, was zu unerwarteten Ergebnissen führen kann, wenn der Text Befehle enthält. Beispiel:
\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}
Dies sieht oberflächlich betrachtet wie Fall 1 mit aus \strong{spaced}
, aber die vollständige Erweiterung bedeutet, dass es jetzt versucht,
\capitialisewords{\protect\leavevmode{\protect\color{red}\protect\textbf{spaced}} repetition system}
Dies folgt nun den Regeln: verwerfen Sie das ursprüngliche \protect
, dann wenden Sie Fall 1 an, was als endet
\leavevmode{\uppercase\protect\color{red}\protect\textbf{spaced}}
was falsch ist. Es gibt zwei Lösungen. Entweder verwenden Sie nur robuste Befehle:
\newrobustcmd*{\strong}[1]{\textcolor{red}{\textbf{#1}}}
oder holen Sie sich zuerst den Wert des Felds und speichern Sie ihn in einem Befehl mit \glsfetchfield
und wenden Sie ihn dann an \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}
Hier gibt es noch ein Problem. Der Wert des long
Schlüssels ist immer noch vollständig erweitert. (Sie können den Wert anzeigen, indem Sie \showglslong{srs}
nach der Definition des Eintrags Folgendes verwenden. Dies verwendet \show
den internen Befehl, der zum Speichern des Feldwerts verwendet wird long
.) Dies liegt daran, dass die Felderweiterung für den long
Schlüssel standardmäßig aktiviert ist. Sie können dies deaktivieren, indem Sie Folgendes verwenden \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}
Dies funktioniert jetzt ordnungsgemäß.
Beachten Sie, dass dies \xcapitalisewords
eine Verknüpfung ist, mit \expandafter\capitalisewords\expandafter
der Sie Folgendes tun können:
\newrobustcmd*{\TCac}[1]{%
\glsfieldfetch{#1}{long}{\phrase}%
\xcapitalisewords{\phrase}%
}
Ab glossaries
v4.22 können Sie
\glsentrytitlecase{src}{long}
Dies bewirkt im Endeffekt dasselbe wie das \TCac
obige Beispiel, allerdings ist das zweite Argument der Feldname (z. B. first
oder text
oder desc
).
Antwort2
Paket wird verwendet titlecaps
.
\documentclass{article}
\usepackage{glossaries}
\usepackage{titlecaps}
\newacronym{srs}{SRS}{spaced repetition system}
\begin{document}
\titlecap{\glsentrylong{srs}}
\end{document}
Beachten Sie, dass Sie die Funktion verwenden können \Addlcwords{}
, die die Großschreibung bestimmter Wörter ausschließt. Darüber hinaus werden (die meisten) Satzzeichen und Klammern automatisch ausgeblendet, wenn ermittelt wird, was großgeschrieben werden soll.
\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}
ERGÄNZUNG(BEARBEITET)
Der OP weist in einem Kommentar darauf hin, dass die Methode in Abschnittsüberschriften von das neue ACM-Format(https://www.acm.org/publications/proceedings-template). Das Problem scheint nicht bei zu liegen \titlecap
, aber das \glsentrylong
funktioniert nicht in der Abschnittsüberschrift. Der folgende Workaround bringt einen da durch, wobei ich \edef
das Akronym einfüge, bevor ich es in der Abschnittsüberschrift verwende.
\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}
Die stringstrings
Version ist (beachten Sie die Schreibweise von „großgeschrieben“) unten angegeben. Als Autor von stringstrings
und titlecaps
empfehle ich jedoch aus Effizienzgründen dringend, für diese Aufgabe titlecaps
anstelle von zu verwenden.stringstrings
\documentclass{article}
\usepackage{glossaries}
\usepackage{stringstrings}
\newacronym{srs}{SRS}{spaced repetition system}
\begin{document}
\capitalizewords{\glsentrylong{srs}}
\end{document}