Сохранение предыдущего элемента цикла в промежуточной переменной для динамического создания команды

Сохранение предыдущего элемента цикла в промежуточной переменной для динамического создания команды

Я динамически создаю команды и хотел бы определить их на основе текущего значения в списке итераций. Проблема в том, что текущее значение появляется как последнее значение итерируемой переменной.

Вот MWE. Этот пример, очевидно, бессмыслен, но я могу придумать приложение, запоминающее последнее значение в цикле. Я перепробовал много вариаций \expandafter, \edef, и не могу понять. Я читал о расширении. Я хотел бы определить некоторую промежуточную переменную и передать ее в команды, которые я генерирую, чтобы она отображала "1:1, 2:2".

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

\documentclass[11pt,a4paper]{article}
\usepackage{etoolbox}
\begin{document}%
    \noindent%
    \newcounter{n}%
    \setcounter{n}{0}%
    \renewcommand{\do}[1]{%
        \let\Num#1%
        \setcounter{n}{#1}%
        \expandafter\newcommand\csname C\alph{n}\endcsname{\textbf{#1}: \Num}% create a command
    }%
    \docsvlist{1,2,3,4}%
\Ca\\
\Cb\\
\end{document}

РЕДАКТИРОВАТЬ:

Вот более наглядный пример. Я хотел бы определить команду, которая отображает текущий номер и предыдущий номер в цикле, но предыдущий номер всегда последний в списке.

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

\documentclass[11pt,a4paper]{article}
\usepackage{etoolbox}
\usepackage{xintexpr}
\begin{document}%
    \noindent%
    \newcounter{n}%
    \setcounter{n}{0}%
    \renewcommand{\do}[1]{%
        \edef\evenodd{\xintthe\xintiexpr\value{n}/:2\relax}% get the column num
        \ifnum\evenodd=0%
            \let\PrevNum#1%
        \fi
        \ifnum\evenodd=1%
            \expandafter\newcommand\csname C\alph{n}\endcsname{prev: \PrevNum, current: #1}% create a command
        \fi
        \setcounter{n}{#1}%
    }%
    \docsvlist{1,2,3,4,5,6}%
\Ca\\
\Cc\\
\Ce\\
\end{document}

решение1

Не совсем понятно, какова конечная цель. Однако, \letне является правильным инструментом, и вам следует использовать \def. Кроме того, вам нужно получить доступ к расширению \PrevNum, а не к управляющей последовательности.

\documentclass[11pt,a4paper]{article}
\usepackage{etoolbox}
\usepackage{xintexpr}

\newcounter{n}
%\setcounter{n}{0}%
\renewcommand{\do}[1]{%
  \edef\evenodd{\xintthe\xintiexpr\value{n}/:2\relax}% get the column num
  \ifnum\evenodd=0
    \def\PrevNum{#1}%
  \fi
  \ifnum\evenodd=1
    \definetablecommand{C\alph{n}}{#1}{\PrevNum}%
  \fi
\setcounter{n}{#1}%
}
\newcommand{\definetablecommand}[3]{%
  \expandafter\definetablecommandaux\expandafter{#3}{#1}{#2}%
}
\newcommand{\definetablecommandaux}[3]{%
  \expandafter\newcommand\csname #2\endcsname{prev: #1, current #3}%
}

\docsvlist{1,2,3,4,5,6}

\begin{document}

\Ca

\Cc

\Ce

\end{document}

Обратите внимание, что %после констант это неправильно и может привести к неожиданным результатам.

Проведение подобных мероприятий внутри помещения documentтакже является спорным.

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

С другим стилем программирования.

\documentclass[11pt,a4paper]{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\definetablecommands}{m}
 {
  \ilikethevegetable_dtc_main:n { #1 }
 }

\seq_new:N \l__ilikethevegetables_dtc_data_seq
\tl_new:N \l__ilikethevegetables_dtc_item_tl

\cs_new_protected:Nn \ilikethevegetable_dtc_main:n
 {
  \seq_set_from_clist:Nn \l__ilikethevegetables_dtc_data_seq { #1 }
  \seq_map_indexed_inline:Nn \l__ilikethevegetables_dtc_data_seq
   {% ##1 is the current item index, ##2 is the current item
    \int_if_odd:nTF { ##1 }
     {% remember the item
      \tl_set:Nn \l__ilikethevegetables_dtc_item_tl { ##2 }
     }
     {% define the control sequence
      \cs_new:cpx { C \int_to_alph:n { ##1 - 1 } }
       {
        \exp_not:n { prev:~} \exp_not:V \l__ilikethevegetables_dtc_item_tl ,~
        \exp_not:n { current:~ ##2 }
       }
     }
   }
 }

\ExplSyntaxOff

\definetablecommands{1,2,3,4,5,6}

\begin{document}

\Ca

\Cc

\Ce

\end{document}

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