создать и использовать заглавную букву CS из строчной строки

создать и использовать заглавную букву CS из строчной строки

Я ищу способ сделать следующее

Я хочу иметь команду

\setcitation[2]

со следующим определением

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

По сути, каждый раз, когда он вызывается с аргументами xXx и yyy, он создает новую команду.

\mycommoncitationxxx

определяется как

\yyy

Теперь, имея входные данные xxX, я хотел бы получить yyy. Итак, что должно произойти: преобразовать xxX в строчные xxx, вызвать \mycommoncitationxxx

Я попробовал сделать это следующим образом:

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

И так далее:

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

Однако ни то, ни другое не работает.

Для первой части (определение моей команды setcitation) я основывал свое решение напостроить заглавную букву CS из строчной строки и дать ей определение

По второй части я пока не нашел никакой помощи.

Полный пример, который также показывает, как я хочу использовать эти команды:

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

здесь, в строке \cite{...} все начинает идти не так.

решение1

Вам нужна расширяемая версия \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}

Для компактности я использовал список свойств.

введите описание изображения здесь

решение2

Я только что опубликовал еще один ответ наРасширяемая возможность изменения регистра букв и использования внутри \csname, без пакета.

Ответ можно найти по адресуhttps://tex.stackexchange.com/a/349895/118714.

Этот ответ содержит процедуру \UD@ExpandableLowercase, которая обеспечивает перевод в нижний регистр тех 26 catcode-11(letter)-character-tokens, которые соответствуют 26 буквам латинского алфавита в течение двух шагов расширения. Эта процедура не требует eTeX или подобных расширений.

(!!!Имейте в виду, что чтение и токенизация TeX входных данных, состоящих из символов латинского алфавита, обычно приводит к появлению токенов catcode-11(буква)-символа, а развертывание \string, \meaning, \jobmaneи подобных примитивов приводит к появлению токенов catcode-12(другой)-символа!!!)

В качестве (вероятно, неприятного) побочного эффекта эта процедура заменяет пары совпадающих токенов catcode-1-character-tokens и catcode-2-character-tokens парами совпадающих фигурных токенов catcode-1-brace-tokens и фигурных токенов catcode-2-brace-tokens, то есть {и }.

Я думаю, что это не должно быть проблемой для простых TeX и LaTeX2e, так как в этих форматах обычно единственным символом с кодом категории 1 является открывающая фигурная скобка {, а единственным символом с кодом категории 2 является закрывающая фигурная скобка }.

Связанный контент