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