我目前正在从事一个包含数百个枚举项目的项目,每个项目都包含一个段落,这些段落涉及 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部分
至于更大的问题,即选择自己的红球和蓝球序列,我改变策略并让用户使用由R
和B
标记组成的字符串来指定红色/蓝序列。
这里,\makeballs
now 接受输入字符串作为参数,并剥离第一个标记,用它来决定红色或蓝色。然后,它递归地将其余输入标记传递回自身,直到列表耗尽。
\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}