Как использовать переменную списка токенов из \prop_get

Как использовать переменную списка токенов из \prop_get

Вот MWE. Я использую список токенов и могу получить 10 и октябрь в финальном pdf-файле.

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l_my_tl
\prop_new:N \l_my_prop

\NewDocumentCommand{\myset}{m}
{
    \tl_set:Nn \l_my_tl { #1 }
    \prop_put:Nnn \l_my_prop {test} {#1}
}

\NewDocumentCommand{\myget}{}
{
     \tl_use:N \l_my_tl
%%% comment out the above line and uncomment the below lines
%     \prop_get:NnN \l_my_prop {test} \l_tmpa_tl
%     \tl_use:N \l_tmpa_tl
}

\ExplSyntaxOff

\newcommand\MonthName[1]{%
  \ifcase#1\relax\or
  January \or Feburary \or March
  \or April \or May \or June
  \or July \or August \or September
  \or October \or November \or December
  \else#1\fi
}
\myset{10}
\begin{document}
\myget\\
\MonthName{\myget}
\end{document}

Затем, если я перейду к списку пропов (как говорится в комментарии), то есть,

\NewDocumentCommand{\myget}{}
{
     \prop_get:NnN \l_my_prop {test} \l_tmpa_tl
     \tl_use:N \l_tmpa_tl
}

сообщается об ошибке\MonthName{\myget}

! Missing number, treated as zero.

\prop_getвосстанавливает значение, сохраненное с помощью ключа testиз списка свойств \l_my_prop, и помещает его в переменную списка токенов \l_tmpa_tl. И я использую эту переменную. По сравнению с первым случаем, я думаю, что это как-то связано с \prop_get. Но я не знаю, как это исправить.

решение1

\prop_get:NnNне расширяется, поэтому вы не можете использовать его напрямую в \ifcase. При \ifcaseпопытке расширения \myget(которое не расширяется из-за \prop_get:NnN) происходит сбой, и TeX сообщает Missing number, treated as zero.

Однако присваивание, которое вы делаете, \l_tmpa_tlпо сути бесполезно, поэтому вы можете пропустить этот шаг и использовать его \prop_item:Nnнапрямую, что является расширяемым, и сделать \mygetрасширяемым с помощью \NewExpandableDocumentCommand:

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l_my_tl
\prop_new:N \l_my_prop

\NewDocumentCommand{\myset}{m}
{
    \tl_set:Nn \l_my_tl { #1 }
    \prop_put:Nnn \l_my_prop {test} {#1}
}

\NewExpandableDocumentCommand{\myget}{}
{
     % \tl_use:N \l_my_tl
%%% comment out the above line and uncomment the below lines
    \prop_item:Nn \l_my_prop {test}
}

\ExplSyntaxOff

\newcommand\MonthName[1]{%
  \ifcase#1\relax\or
  January \or Feburary \or March
  \or April \or May \or June
  \or July \or August \or September
  \or October \or November \or December
  \else#1\fi
}
\myset{10}
\begin{document}
\myget\\
\MonthName{\myget}
\end{document}

Вы можете использовать большеexpl3 -у \int_case:nnтакже:

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l_my_tl
\prop_new:N \l_my_prop

\NewDocumentCommand{\myset}{m}
  {
    \tl_set:Nn \l_my_tl { #1 }
    \prop_put:Nnn \l_my_prop {test} {#1}
  }

\NewExpandableDocumentCommand{\myget}{}
  {
    \prop_item:Nn \l_my_prop {test}
  }
\NewExpandableDocumentCommand{\MonthName}{m}
  {
    \int_case:nnF { #1 }
      {
        {  1 } { January }
        {  2 } { Feburary }
        {  3 } { March }
        {  4 } { April }
        {  5 } { May }
        {  6 } { June }
        {  7 } { July }
        {  8 } { August }
        {  9 } { September }
        { 10 } { October }
        { 11 } { November }
        { 12 } { December }
      }
      { \int_eval:n {#1} }
  }

\ExplSyntaxOff

\myset{10}
\begin{document}
\myget\\
\MonthName{\myget}
\end{document}

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