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.
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
, \jobmane
und ä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 }
.