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.
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@ExpandableLowercase
que 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
, \meaning
y \jobmane
las 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 }
.