Erstellen und verwenden Sie ein großgeschriebenes CS aus einer kleingeschriebenen Zeichenfolge

Erstellen und verwenden Sie ein großgeschriebenes CS aus einer kleingeschriebenen Zeichenfolge

Ich suche nach einer Möglichkeit, Folgendes zu erledigen

Ich möchte ein Kommando haben

\setcitation[2]

mit der folgenden Definition

\def\setcitation#1#2{\lowercase{\expandafter\gdef\csname mycommoncitation#1\endcsname}{#2}}

Im Wesentlichen erzeugt es jedes Mal, wenn es mit den Argumenten xXx und yyy aufgerufen wird, einen neuen Befehl

\mycommoncitationxxx

definiert als

\yyy

Nun, bei einer Eingabe von xxX möchte ich yyy erhalten. Was also passieren muss: xxX in kleines xxx umwandeln, \mycommoncitationxxx aufrufen

Ich habe versucht, dies wie folgt zu tun:

\newcommand\getcitation[1]{%
\lowercase{\csuse{mycommoncitation#1}}
}

Und zwar wie folgt:

\newcommand\getcitation[1]{\lowercase{\expandafter\gdef\csname mycommoncitation#1\endcsname}}

Aber beides funktioniert nicht.

Für den ersten Teil (die Definition meines setcitation-Befehls) basierte ich meine Lösung aufaus einem kleingeschriebenen String einen großgeschriebenen CS zu bilden und ihm eine Definition zu geben

Für den zweiten Teil finde ich noch keine Hilfe.

Vollständiges Beispiel, das auch zeigt, wie ich diese Befehle verwenden möchte:

\documentclass{article} 
\usepackage{etoolbox} 
\newcommand{\setcitation}[2]{\lowercase{\csdef{mycommoncitation#1}}{#2}} 
\newcommand{\getcitation}[1]{\lowercase{\csuse{mycommoncitation#1}}} 

\newcommand{\getcitationifexistsotherwiseinput}[1]{\lowercase{\ifcsdef{mycommoncitation#1}{\getcitation{#1}}{#1}}}


\begin{document} 
\setcitation{Foo}{Bar} 
\getcitation{Foo} 
\mycommoncitationfoo
\getcitationifexistsotherwiseinput{Foo} %My expectation: Bar
\getcitationifexistsotherwiseinput{foo} %my expectation: Bar
\getcitationifexistsotherwiseinput{boo} %my expectation: boo
%Now I want a command that returns 
% \getcitation{FOO} 

\cite{\getcitation{foo}} %my expectaiton: "undefined citation Bar"
\end{document}

hier, in der Zeile \cite{...}, beginnen die Dinge schief zu laufen.

Antwort1

Sie benötigen eine erweiterbare Version von \lowercase:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\setcitation}{mm}
 {
  \prop_gput:Nxn \g_bartbog_citations_prop { \str_lowercase:n { #1 } } { #2 }
 }
\DeclareExpandableDocumentCommand{\getcitation}{m}
 {
  \prop_item:Nf \g_bartbog_citations_prop { \str_lowercase:n { #1 } }
 }

\cs_generate_variant:Nn \prop_gput:Nnn { Nx }
\cs_generate_variant:Nn \prop_item:Nn { Nf }
\prop_new:N \g_bartbog_citations_prop
\ExplSyntaxOff

\setcitation{Foo}{Bar} 

\begin{document}
\getcitation{Foo} 
\getcitation{foo} 
\getcitation{FOO} 

\cite{\getcitation{Foo}},
\cite{\getcitation{foo}},
\cite{\getcitation{FOO}}

\begin{thebibliography}{1}

\bibitem{Bar} Whatever

\end{thebibliography}

\end{document}

Aus Gründen der Kompaktheit habe ich eine Eigenschaftsliste verwendet.

Bildbeschreibung hier eingeben

Antwort2

Ich habe gerade eine weitere Antwort gepostet aufErweiterbare Änderung der Groß- und Kleinschreibung und Verwendung innerhalb von \csname, ohne Paket.

Die Antwort finden Sie unterhttps://tex.stackexchange.com/a/349895/118714.

Diese Antwort enthält eine Routine \UD@ExpandableLowercase, die innerhalb von zwei Expansionsschritten die Kleinschreibung jener 26 Catcode-11(Buchstaben)-Zeichentoken liefert, die den 26 Buchstaben des lateinischen Alphabets entsprechen. Diese Routine erfordert keine eTeX- oder ähnliche Erweiterungen.

(!!!Beachten Sie, dass das Lesen und Tokenisieren von Eingaben, die aus Zeichen des lateinischen Alphabets bestehen, durch TeX normalerweise Catcode-11(Buchstaben)-Zeichentoken ergibt, während das Erweitern von \string, \meaning, \jobmaneund ähnlichen Primitiven Catcode-12(andere)-Zeichentoken liefert!!!)

Als (wahrscheinlich unbeliebter) Nebeneffekt ersetzt diese Routine Paare aus passenden Catcode-1-Zeichen-Tokens und Catcode-2-Zeichen-Tokens durch Paare aus passenden geschweiften Catcode-1-Klammer-Tokens und geschweiften Catcode-2-Klammer-Tokens, also {und }.

Ich denke, dass dies bei einfachem TeX und LaTeX2e kein Problem sein sollte, da bei diesen Formaten normalerweise die öffnende geschweifte Klammer das einzige Zeichen mit dem Kategoriecode 1 {und die schließende geschweifte Klammer das einzige Zeichen mit dem Kategoriecode 2 ist }.

verwandte Informationen