Vorheriges Element der Schleife in Zwischenvariable speichern, um dynamische Befehle erstellen zu können

Vorheriges Element der Schleife in Zwischenvariable speichern, um dynamische Befehle erstellen zu können

Ich erstelle dynamisch Befehle und möchte diese basierend auf dem aktuellen Wert in einer Iterationsliste definieren. Das Problem besteht darin, dass der aktuelle Wert als letzter Wert der iterierten Variable erscheint.

Hier ist ein MWE. Dieses Beispiel ist offensichtlich bedeutungslos, aber eine Anwendung, die mir einfällt, ist das Merken des letzten Wertes in der Schleife. Ich habe viele Variationen von \expandafter, \edef, ausprobiert und komme nicht dahinter. Ich habe über die Erweiterung gelesen. Ich möchte eine Zwischenvariable definieren und sie in die Befehle einfügen, die ich erzeuge, sodass sie „1:1, 2:2“ anzeigt.

Bildbeschreibung hier eingeben

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

BEARBEITEN:

Hier ist ein anschaulicheres Beispiel. Ich möchte einen Befehl definieren, der in der Schleife die aktuelle Nummer und die vorherige Nummer anzeigt, wobei die vorherige Nummer immer die letzte in der Liste ist.

Bildbeschreibung hier eingeben

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

Antwort1

Es ist nicht ganz klar, was das endgültige Ziel ist. Allerdings \letist nicht das richtige Werkzeug und Sie sollten verwenden \def. Außerdem müssen Sie auf die Erweiterung von zugreifen \PrevNumund nicht auf die Steuersequenz.

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

Beachten Sie, dass „ %after constants“ falsch ist und zu unerwarteten Ergebnissen führen kann.

Auch die Durchführung solcher Vorgänge im Innenbereich documentist umstritten.

Bildbeschreibung hier eingeben

Mit einem anderen Programmierstil.

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

verwandte Informationen