![枚举具有不同基数的列表](https://linux22.com/image/332317/%E6%9E%9A%E4%B8%BE%E5%85%B7%E6%9C%89%E4%B8%8D%E5%90%8C%E5%9F%BA%E6%95%B0%E7%9A%84%E5%88%97%E8%A1%A8.png)
这里的一些旧测试的问题包括分析几个项目(每个项目都有一个不同的数字),并将所有正确项目的数字相加。为了避免多个组合给出相同的答案(如1+3 = 4
和)4=4
,数字都是 2 的幂,因此:
01. This is the first item (2⁰)
02. This is the second item (2¹)
04. This is the third item (2²)
08. This is the forth item (2³)
16. This is the fifth item (2⁴)
所以我的目标是重新创建这种枚举列表,遵循 2 的幂(0 -- 1 -- 2 -- 4 -- 8 -- 16 -- 32 等等)。有没有可以做到这一点的包或者一种相当简单的解决方法?在我目前正在处理的文档中,我已经在使用该enumitem
包了。
答案1
enumitem
与特征的“可怕”混合expl3
,定义一个新的counter formater
名称baseenum
——然而我必须用更深层次的嵌套来测试。
\documentclass{article}
\usepackage{enumitem}
\usepackage{xparse}
\makeatletter
\def\basetwoenum#1{\expandafter\@basetwoenum\csname c@#1\endcsname}
\ExplSyntaxOn
\def\@basetwoenum#1{%
\int_set:Nn \l_tmpa_int \c_one
\int_step_inline:nnnn {2}{1}{\number#1}{%
\int_set:Nn \l_tmpb_int { 2 * \l_tmpa_int }
\int_set_eq:NN \l_tmpa_int \l_tmpb_int
}
\int_use:N \l_tmpa_int
}
\ExplSyntaxOff
\AddEnumerateCounter{\basetwoenum}{\@basetwoenum}{100}
\makeatother
\begin{document}
\begin{enumerate}[label={\basetwoenum*}]
\item First
\item Second
\item Third
\item Fourth
\item Fifth
\end{enumerate}
Resume it
\begin{enumerate}[label={\basetwoenum*},resume]
\item First
\item Second
\item Third
\item Fourth
\item Fifth
\end{enumerate}
\end{document}
答案2
Christian Hupfer 解决方案的一个变体,但完全可以扩展:
\documentclass{article}
\usepackage{enumitem}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\basetwoenum}{m}
{
\basetwoenum_main:n { #1 }
}
\cs_new:Nn \basetwoenum_main:n
{
\exp_args:Nc \basetwoenum_eval:n { c@#1 }
}
\cs_new:Nn \basetwoenum_eval:n
{
\fp_eval:n { 2 ** (#1-1) }
}
%% for keeping enumitem happy
\cs_set_eq:cN { @basetwoenum } \basetwoenum_main:n
\ExplSyntaxOff
\makeatletter
\AddEnumerateCounter{\basetwoenum}{\@basetwoenum}{000}
\makeatother
\begin{document}
\begin{enumerate}[label={\basetwoenum*}]
\item First
\item Second
\item Third
\item Fourth
\item Fifth
\end{enumerate}
Resume it
\begin{enumerate}[label={\basetwoenum*},resume]
\item First
\item Second
\item Third
\item Fourth
\item Fifth
\end{enumerate}
\end{document}
这给出了最高为 2 53 的正确结果;当然,如果您计划使用超过十个项目,则必须相应地将最后一个参数中的零的数量增加到\AddEnumerateCounter
。
答案3
\documentclass{article}
\usepackage{tikz}
\renewcommand*{\labelenumi}{\pgfmathparse{int(2^(\theenumi-1))} \pgfmathresult}
\begin{document}
\begin{enumerate}
\item One
\item Two
\item Three
\item more
\item more
\item more
\item more
\item more
\item more
\item more
\item more
\item more
\item more
\end{enumerate}
\end{document}
答案4
这是一个基于 LuaLaTeX 的解决方案,可与enumitem
包配合使用。它定义了一个名为 的枚举环境powertwoenum
,其中连续的项目编号为 1、2、4、8、32 等。列表中的项目可以通过通常的-机制powertwoenum
进行交叉引用。\label
\ref
% !TEX TS-program = lualatex
\documentclass{article}
\newcommand\powertwo{\directlua{tex.sprint(2^(\arabic{powertwoenumi}-1))}}
\usepackage{enumitem}
\newlist{powertwoenum}{enumerate}{1}
\setlist[powertwoenum]{label=\protect\powertwo.,ref=\protect\powertwo}
\begin{document}
\begin{powertwoenum}
\item First
\item Second
\item Third
\item Fourth
\item Fifth \label{item:five}
\end{powertwoenum}
A cross-reference to item \ref{item:five}.
Resume the enumerated list.
\begin{powertwoenum}[resume]
\item First
\item Second
\item Third
\item Fourth
\item Fifth
\end{powertwoenum}
\end{document}