
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.
\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.
\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 \let
ist nicht das richtige Werkzeug und Sie sollten verwenden \def
. Außerdem müssen Sie auf die Erweiterung von zugreifen \PrevNum
und 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 document
ist umstritten.
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}