按顺序打印随机列表(\pgfmathdeclarerandomlist)

按顺序打印随机列表(\pgfmathdeclarerandomlist)

我使用包声明了随机列表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

这是非 TiZ 实现。

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

相关内容