我使用包声明了随机列表TikZ
,并且可以随机获取项目。但同时我需要按顺序获取所有项目。我该怎么做?是否可以打印\mylist
在非逗号变量中声明的项目?
\documentclass[a4paper,14pt]{extreport}
\usepackage{tikz}
\def\mylist{{one}{two}{three}{four}{five}}
\pgfmathdeclarerandomlist{mynum}{\mylist} %Define the list
\begin{document}
\pgfmathrandomitem{\mynum}{mynum}
\pgfmathresult~\mynum\\
\pgfmathrandomitem{\mynum}{mynum}
\pgfmathresult~\mynum\\
\pgfmathrandomitem{\mynum}{mynum}
\pgfmathresult~\mynum\\
\pgfmathrandomitem{\mynum}{mynum}
\pgfmathresult~\mynum\\
\pgfmathrandomitem{\mynum}{mynum}
\pgfmathresult~\mynum\\
\end{document}
答案1
定义命令
\newcommand\lengthof[1]{\csname pgfmath@randomlist@#1\endcsname}
\newcommand\nthof[2]{\csname pgfmath@randomlist@#2@#1\endcsname}
设<list>
为已用 定义的列表的名称 \pgfmathdeclarerandomlist
。然后\lengthof{<list>}
返回 中的元素数<list>
,并\nthof{<n>}{<list>}
返回 的<n>
第 个元素<list>
。
要遍历列表,我们使用\foreach
循环(在包中定义pgffor
)。例如,如果列表被调用mynum
,那么代码
\nthof{1}{mynum}%
\foreach \i in {2,...,\lengthof{mynum}}
{, \nthof{\i}{mynum}}
将列出用逗号分隔的列表元素。
下面的代码定义了mynum
原始问题中给出的列表,并按顺序和随机的方式遍历该列表。
\documentclass{article}
\usepackage{pgffor}
\newcommand\lengthof[1]{\csname pgfmath@randomlist@#1\endcsname}
\newcommand\nthof[2]{\csname pgfmath@randomlist@#2@#1\endcsname}
\def\mylist{{one}{two}{three}{four}{five}}
\pgfmathdeclarerandomlist{mynum}{\mylist}
\begin{document}
\nthof{1}{mynum}%
\foreach \i in {2,...,\lengthof{mynum}}
{, \nthof{\i}{mynum}}
\begin{minipage}[t]{3cm}
Random:
\foreach \i in {1, ..., 5}
{\pgfmathrandomitem{\mynum}{mynum}%
\\\pgfmathresult~\mynum
}
\end{minipage}
\qquad
\begin{minipage}[t]{3cm}
Sequential:
\foreach \i in {1, ..., \lengthof{mynum}}
{\\\i~\nthof{\i}{mynum}
}
\end{minipage}
\end{document}
答案2
这是非 Ti钾Z 实现。
\setmylist{<item 1>,<item 2>,...<item n>}
创建包含指定项目的有序列表n
;\mylist[<integer>]
如果未指定可选参数,则打印<integer>
从列表中伪随机选择的项目或等于列表中项目总数的数字;\sortmylist
按顺序打印列表。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\clist_new:N \g_Konstantin_mylist_clist
\int_new:N \l_Konstantin_mylist_int
\cs_new_protected_nopar:Nn \Konstantin_setmylist:n
{
\clist_gset:Nn \g_Konstantin_mylist_clist { #1 }
}
\cs_new_protected_nopar:Nn \Konstantin_mylist:n
{
\int_zero:N \l_Konstantin_mylist_int
\int_while_do:nn
{
\l_Konstantin_mylist_int < #1
}
{
\int_incr:N \l_Konstantin_mylist_int
\fp_set:Nn \l_tmpa_fp { randint ( \clist_count:N \g_Konstantin_mylist_clist ) }
\int_to_arabic:n { \fp_to_int:N \l_tmpa_fp }
~ -- ~
\clist_item:Nn \g_Konstantin_mylist_clist { \fp_to_int:N \l_tmpa_fp }
\par
}
}
\cs_new_protected_nopar:Nn \Konstantin_mylist:
{
\Konstantin_mylist:n { \clist_count:N \g_Konstantin_mylist_clist }
}
\NewDocumentCommand \sortmylist {}
{
\int_zero:N \l_tmpa_int
\clist_map_inline:Nn \g_Konstantin_mylist_clist
{
\int_incr:N \l_tmpa_int
\int_to_arabic:n { \l_tmpa_int }
{} ~ -- ~ ##1 \par
}
}
\NewDocumentCommand \setmylist { m }
{
\Konstantin_setmylist:n { #1 }
}
\NewDocumentCommand \mylist { o }
{
\IfNoValueTF { #1 }
{
\Konstantin_mylist:
}
{
\Konstantin_mylist:n { #1 }
}
}
\ExplSyntaxOff
\begin{document}
Create ordered list
\setmylist{one,two,three,four,five}
Random items equal to total number in list:
\mylist
Four random items from list:
\mylist[4]
Seven random items from list:
\mylist[7]
Items from list in original order:
\sortmylist
\end{document}