Quiero crear una matriz que contenga valores específicos de un contador para usarlos en un bucle foreach. Entonces quiero definir un comando que agregue el valor del contador real al final de la lista. Lo que puedo hacer es:
\documentclass{standalone}
\usepackage{pgfmath,pgffor}
\begin{document}
\def\names{{"Katie","Frank","Laura","Joe"}}%
\newcounter{lines}%
\setcounter{lines}{3}%
\def\arr{1,\arabic{lines}}%
\foreach \i in \arr {%
Name \i: \pgfmathparse{\names[\i]}\pgfmathresult, }
\end{document}
Pero lo que necesito es una lista vacía arr
y una función que pueda usar para llenar arr
con valores lines
como, por ejemplo \addtoarr{\arabic{lines}}
.
Intenté usar el lstdock
paquete como:
\let\arr\@empty
\def\addtolist#1#2{%
\lst@lAddTo#1{#2}}
\addtolist{\arr}{\arabic{lines}}
Pero esto me da un error que no entiendo.
Respuesta1
Hay diferentes métodos, aquí tienes uno.
\documentclass{article}
\usepackage{pgfmath,pgffor}
\begin{document}
\def\names{{"Katie","Frank","Laura","Joe"}}%
\newcounter{lines}%
\setcounter{lines}{1}%
\newcommand*\arr{}%
\newcommand{\mtadd}{%
\ifx\arr\empty
\edef\arr{\arabic{lines}}
\else\edef\arr{\arr,\arabic{lines}}
\fi}
\mtadd
\setcounter{lines}{3}%
\mtadd
\foreach \i in \arr {%
Name \i: \pgfmathparse{\names[\i]}\pgfmathresult, }
\end{document}
Respuesta2
Si solo está interesado en escupir algunos contenidos de una lista, quizás lo siguiente pueda ser de su interés:
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\listsep}{, }
\makeatletter
\newcommand{\@insertlistsep}{}
\newcounter{@listname}
\newcommand{\addtolist}[1]{%
\stepcounter{@listname}% Add one person to counter
\expandafter\@namedef\expandafter{@listnames:\the@listname}{#1}}% Define counter-based name
\newcommand{\printlist}[1]{%
\renewcommand{\@insertlistsep}{\renewcommand{\@insertlistsep}{\listsep}}% https://tex.stackexchange.com/a/89187/5764
\renewcommand*{\do}[1]{\@insertlistsep Name~##1: \textbf{\@nameuse{@listnames:##1}}}% How each item will be processed
\docsvlist{#1}}% Process list
\makeatother
\begin{document}
\addtolist{Katie}% 1
\addtolist{Frank}% 2
\addtolist{Laura}% 3
\addtolist{Joe}% 4
\printlist{1,2}
\printlist{}
\printlist{1,3,4}
\printlist{3,3,3}
\end{document}
El trabajo adicional, si es necesario, sería incorporar una \clearlist
función, así como también realizar algunas comprobaciones de errores para asegurarse de no acceder a elementos fuera de la lista.
El procesamiento de listas se analiza en¿Cómo iterar sobre una lista separada por comas?