construir y usar un CS en mayúscula a partir de una cadena en minúscula

construir y usar un CS en mayúscula a partir de una cadena en minúscula

Estoy buscando una manera de hacer lo siguiente

quiero tener un comando

\setcitation[2]

con la siguiente definición

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

Básicamente, lo que hace es que cada vez que se llama con los argumentos xXx y yyy, crea un nuevo comando.

\mycommoncitationxxx

definido como

\yyy

Ahora, dada una entrada, xxX, me gustaría sacar yyy. Entonces, ¿qué tiene que pasar? Convierta xxX a xxx minúscula, llame a \mycommoncitationxxx

Intenté hacer esto de la siguiente manera:

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

Y de la siguiente manera:

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

Sin embargo, ninguno de los dos funciona.

Para la primera parte (la definición de mi comando setcitation) basé mi solución enconstruir un CS en mayúscula a partir de una cadena en minúscula y darle una definición

Para la segunda parte todavía no encuentro ayuda.

Ejemplo completo, que también muestra cómo quiero usar estos comandos:

\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}

aquí, en la línea \cite{...} las cosas empiezan a ir mal.

Respuesta1

Necesita una versión ampliable de \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}

Utilicé una lista de propiedades para que sea más compacto.

ingrese la descripción de la imagen aquí

Respuesta2

Acabo de publicar otra respuesta aCambie de manera expandible las letras mayúsculas y minúsculas y utilícelas dentro de \csname, sin un paquete.

Esa respuesta se puede encontrar enhttps://tex.stackexchange.com/a/349895/118714.

Esa respuesta contiene una rutina \UD@ExpandableLowercaseque ofrece minúsculas de esos 26 tokens de caracteres catcode-11 (letra) que corresponden a las 26 letras del alfabeto latino dentro de dos pasos de expansión. Esa rutina no requiere eTeX o extensiones similares.

(!!! Tenga en cuenta que hacer que TeX lea y tokenice la entrada que consta de caracteres del alfabeto latino generalmente produce tokens de caracteres catcode-11 (letra) mientras que la expansión \string, \meaningy \jobmanelas primitivas similares entregan tokens de caracteres catcode-12 (otros) !!!)

Como efecto secundario (probablemente no le guste), esa rutina reemplaza pares de tokens de carácter-1-carácter-código-cat coincidentes y tokens-de-caracteres-código-cat-2 por pares de tokens-correspondencia-1-correspondiente de catcode rizado coincidentes y código de gato rizado-2-corchetes- tokens, es decir {y }.

Creo que esto no debería ser un problema con TeX y LaTeX2e, ya que con estos formatos generalmente el único carácter con código de categoría 1 es la llave de apertura {y el único carácter con código de categoría 2 es la llave de cierre }.

información relacionada