使用 Stackengine 枚举项目的二进制代码索引

使用 Stackengine 枚举项目的二进制代码索引

我目前正在从事一个包含数百个枚举项目的项目,每个项目都包含一个段落,这些段落涉及 1 到 12 个不同主题的某种组合。如果没有任何帮助来区分每个条目的内容,列表就会变得相当繁琐。因此,如果想在每个条目中添加一个小的二进制索引,其中包含 12 个彩色球的序列,代表 12 个不同的主题,红色(表示已解决某个主题)或蓝色(如果未解决该主题)。就像这样---

在此处输入图片描述

这表明,枚举列表中的第一项仅涉及第十、第十一和第十二个主题(每个特定主题被分配一个从 1 到 12 的唯一整数)。

到目前为止我所拥有的是:

\documentclass{article}
\textheight 8.25in \textwidth 4.75in

\usepackage{stackengine,xcolor,lipsum}
\let\svitem\item
\newcommand\difbox[1]{\stackengine{0pt}{\color{white}\rule{5ex}{1.15ex}}{%
    \color{blue!35}$\mkern1mu\makeballs{#1}%
    \textcolor{red}{\makeballs{\the\numexpr12-#1\relax}}$}{O}{c}{F}{F}{L} }
\def\makeballs#1{\ifnum#1>0\relax{\bullet}%
  \expandafter\makeballs\the\numexpr#1-1\relax\fi}
\newenvironment{benumerate}
{\renewcommand\item[1][1]{\def\difficulty{##1}\svitem}%
  \def\labelenumi{\smash{\stackunder[4pt]{\color{blue!65!black}%
  \bfseries\sffamily\theenumi}{\difbox{\difficulty}}}}%
  \enumerate}{\endenumerate}

    \begin{document}
    \large
    \begin{benumerate}
    \setcounter{enumi}{0}
    \item[9] \lipsum[11]
    \item[4] \lipsum[39]
    \item[11] \lipsum[13]
    \item[1] \lipsum[13]
    \end{benumerate}
    \end{document}

输出结果

在此处输入图片描述

该代码是 Steven B. Segletes 对一个问题的回答的修改,该问题仅要求红点是连续的并且全部位于结尾4 球序列。

创建一个带有小球和灰色矩形(也带有阴影)的自定义编号列表

我已经弄清楚如何显示前两项中所示的 12 个球串。但是,当我请求超过 10 个蓝球(例如\item[11] \lipsum[13])或超过 10 个红球(\item[1] \lipsum[13])时,分别在 MWE 的第三和第四个显示项中得到奇怪的输出。

\此外,我还无法弄清楚如何显示二进制索引,使得所有红球不连续地出现在字符串的末尾;例如,第 1、第 3、第 4 和第 10 个条目为红色,而其他地方为蓝色。

因此,我想问以下问题。

问题:我该如何修改给定的代码以便(i)可以容纳 10 种以上的连续颜色,(ii)一种颜色的球不必连续;例如,RBRRBBBBBRBB,以及(iii)12 个球的串不是同时水平显示,而是作为 3x4 的“矩阵”显示,其中顶行包含前四个受试者的彩色球,下一行包含受试者 5-8 的彩色球,最后一行包含受试者 9-12 的彩色球(即,古希腊人会显示长方形数字 12)?

谢谢。

答案1

第1部分

\makeballs在 的定义中,递归参数 需要用括号括起来\makeballs。如果没有括号,任何两位数参数都会导致意外结果。我还在\expandafter同一个位置添加了一个链,以便递归传递一个干净的数字而不是关系\numexpr

\documentclass{article}
\textheight 8.25in \textwidth 4.75in

\usepackage{stackengine,xcolor,lipsum}
\let\svitem\item
\newcommand\difbox[1]{\stackengine{0pt}{\color{white}\rule{5ex}{1.15ex}}{%
    \color{blue!35}$\mkern1mu\makeballs{#1}%
    \textcolor{red}{\makeballs{\the\numexpr12-#1\relax}}$}{O}{c}{F}{F}{L} }
\def\makeballs#1{\ifnum#1>0\relax{\bullet}%
  \expandafter\makeballs\expandafter{\the\numexpr#1-1\relax}\fi}% <--FIX HERE
\newenvironment{benumerate}
{\renewcommand\item[1][1]{\def\difficulty{##1}\svitem}%
  \def\labelenumi{\smash{\stackunder[4pt]{\color{blue!65!black}%
  \bfseries\sffamily\theenumi}{\difbox{\difficulty}}}}%
  \enumerate}{\endenumerate}

    \begin{document}
    \large
    \begin{benumerate}
    \setcounter{enumi}{0}
    \item[9] \lipsum[11]
    \item[4] \lipsum[39]
    \item[11] \lipsum[13]
    \item[1] \lipsum[13]
    \end{benumerate}
    \end{document}

在此处输入图片描述

第2部分

至于更大的问题,即选择自己的红球和蓝球序列,我改变策略并让用户使用由RB标记组成的字符串来指定红色/蓝序列。

这里,\makeballsnow 接受输入字符串作为参数,并剥离第一个标记,用它来决定红色或蓝色。然后,它递归地将其余输入标记传递回自身,直到列表耗尽。

\documentclass{article}
\textheight 8.25in \textwidth 4.75in

\usepackage{stackengine,xcolor,lipsum}
\let\svitem\item
\newcommand\difbox[1]{\stackengine{0pt}{\color{white}\rule{5ex}{1.15ex}}{%
    $\iftrue\makeballs#1\fi$}{O}{c}{F}{F}{L} }
\def\makeballs#1#2\fi{\fi\ifx R#1\textcolor{red}{\bullet}\else
  \ifx B#1\textcolor{blue!35}{\bullet}\fi\fi%
  \ifx\relax#2\relax\else\makeballs#2\fi}
\newenvironment{benumerate}
{\renewcommand\item[1][1]{\def\difficulty{##1}\svitem}%
  \def\labelenumi{\smash{\stackunder[4pt]{\color{blue!65!black}%
  \bfseries\sffamily\theenumi}{\expandafter\difbox\expandafter{\difficulty}}}}%
  \enumerate}{\endenumerate}

    \begin{document}
    \large
    \begin{benumerate}
    \setcounter{enumi}{0}
    \item[RB] \lipsum[11]
    \item[RRRBBBB] \lipsum[39]
    \item[RBBRRRRBRB] \lipsum[13]
    \end{benumerate}
    \end{document}

在此处输入图片描述

\difbox注意:球上的数字不居中是由于 OP 在定义 ( )末尾插入了额外的空格{O}{c}{F}{F}{L} }。我把它留在那里,可能是 OP 的本意。但是删除该空格将导致数字位于球的中央。

第三部分

第 3 部分有点棘手。在这里,我需要提前(在 中)构建球堆栈的参数\tmp,然后将其传递给\Shortstack。幸运的是,\makeballs在这方面是可扩展的,只要我将其应用于\noexpand的实例\textcolor(以及可选的\bullet)。

除了球规范中的R和标记之外,我现在还使用来表示换行符。B.

\documentclass{article}
\textheight 8.25in \textwidth 4.75in

\usepackage{stackengine,xcolor,lipsum}
\setstackEOL{\\}
\let\svitem\item
\newcommand\difbox[1]{\edef\tmp{$\iftrue\makeballs#1\fi$}%
  \stackengine{0pt}{\color{white}\rule{5ex}{1.15ex}}{%
    \expandafter\Shortstack\expandafter{\tmp}}{O}{c}{F}{F}{L} }
\def\makeballs#1#2\fi{\fi\ifx R#1\noexpand\textcolor{red}{\noexpand\bullet}\else
  \ifx B#1\noexpand\textcolor{blue!35}{\noexpand\bullet}\else
  \ifx .#1$\\$\fi\fi\fi%
  \ifx\relax#2\relax\else\makeballs#2\fi}
\newenvironment{benumerate}
{\renewcommand\item[1][1]{\def\difficulty{##1}\svitem}%
  \def\labelenumi{\smash{\stackunder[4pt]{\color{blue!65!black}%
  \bfseries\sffamily\theenumi}{\expandafter\difbox\expandafter{\difficulty}}}}%
  \enumerate}{\endenumerate}

    \begin{document}
    \large
    \begin{benumerate}
    \setcounter{enumi}{0}
    \item[RB.RR] \lipsum[11]
    \item[RRRB.BBBR] \lipsum[39]
    \item[RBBR.RRRB.RBBR] \lipsum[13]
    \end{benumerate}
    \end{document}

在此处输入图片描述

相关内容