Я ищу способ сделать следующее
Я хочу иметь команду
\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 является закрывающая фигурная скобка }
.