construir e usar um CS maiúsculo a partir de uma string minúscula

construir e usar um CS maiúsculo a partir de uma string minúscula

Estou procurando uma maneira de fazer o seguinte

Eu quero ter um comando

\setcitation[2]

com a seguinte definição

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

Essencialmente, o que ele faz é cada vez que é chamado com os argumentos xXx e yyy, ele cria um novo comando

\mycommoncitationxxx

definido como

\yyy

Agora, dada uma entrada, xxX, eu gostaria de retirar yyy. Então o que tem que acontecer: converta xxX para xxx minúsculo, chame \mycommoncitationxxx

Eu tentei fazer isso da seguinte maneira:

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

E da seguinte forma:

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

No entanto, nenhum deles funciona.

Para a primeira parte (a definição do meu comando setcitation), baseei minha solução emconstruir um CS maiúsculo a partir de uma string minúscula e dar-lhe uma definição

Para a segunda parte, ainda não encontro ajuda.

Exemplo completo, que também mostra como quero usar estes 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}

aqui, na linha \cite{...} as coisas começam a dar errado.

Responder1

Você precisa de uma versão expansível 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}

Usei uma lista de propriedades para compactação.

insira a descrição da imagem aqui

Responder2

Acabei de postar outra resposta paraAltere de forma expansível as letras entre maiúsculas e minúsculas e use-as dentro de \csname, sem um pacote.

Essa resposta pode ser encontrada emhttps://tex.stackexchange.com/a/349895/118714.

Essa resposta contém uma rotina \UD@ExpandableLowercaseque fornece letras minúsculas desses 26 tokens de código de gato com 11 caracteres (letra) que correspondem às 26 letras do alfabeto latino em duas etapas de expansão. Essa rotina não requer eTeX ou extensões semelhantes.

(!!! Esteja ciente de que fazer com que o TeX leia e tokenize a entrada que consiste em caracteres do alfabeto latino geralmente produz tokens de caracteres catcode-11 (letra) enquanto expande \string, \meaninge \jobmaneprimitivos semelhantes fornecem tokens catcode-12 (outros) caracteres !!!)

Como um efeito colateral (provavelmente desagradável), essa rotina substitui pares de tokens catcode-1-character e tokens catcode-2-character correspondentes por pares de tokens catcode-1-brace-brace correspondentes e catcode-2-brace- tokens, ou seja, {e }.

Eu acho que isso não deve ser um problema com TeX simples e LaTeX2e, pois com esses formatos geralmente o único caractere com código de categoria 1 é a chave de abertura {e o único caractere com código de categoria 2 é a chave de fechamento }.

informação relacionada