Создать массив определенных значений счетчика

Создать массив определенных значений счетчика

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

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

Но мне нужен пустой список arrи функция, которую я могу использовать для заполнения arrего значениями, linesнапример \addtoarr{\arabic{lines}}, .

Я попробовал использовать lstdockтакой пакет:

\let\arr\@empty

\def\addtolist#1#2{%
  \lst@lAddTo#1{#2}}

\addtolist{\arr}{\arabic{lines}}

Но это приводит к ошибке, которую я не понимаю.

решение1

Есть разные методы, вот один из них.

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

решение2

Если вам просто интересно выложить часть содержимого списка, возможно, следующее может вас заинтересовать:

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

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

При необходимости может потребоваться дополнительная работа по созданию функции \clearlist, а также проверка ошибок, чтобы убедиться, что вы не обращаетесь к элементам за пределами списка.

Обработка списков обсуждается вКак выполнить итерацию по списку, разделенному запятыми?

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