使用多列进行嵌套枚举

使用多列进行嵌套枚举

我目前正在使用嵌套enumerate环境,其中第二级使用 排版multicols,如下所示:

\documentclass[12pt, letterpaper]{article}

\usepackage{amsmath}
\usepackage{amsfonts}
\RequirePackage{amssymb}

\usepackage[T1]{fontenc}
\usepackage[french]{babel}

\usepackage{comment}
\usepackage{enumitem}
\usepackage{lmodern}
\usepackage{multicol}
\usepackage[usenames, dvipsnames, svgnames, table]{xcolor}

\begin{document}

\setlength{\columnsep}{2em}
\setlength{\columnseprule}{0pt}
\begin{enumerate}
  \item \begin{multicols}{5}
          \raggedcolumns
          \begin{enumerate}
            \item $0$
            \item $0$
            \item $-1$
            \item $-\infty $
            \item $\infty $
            \item $1$
            \item $2$
            \item $2$
            \item $1$
            \item $1$
            \item $2$
            \item $1$
            \item $0$
            \item $\textcolor {red}\nexists $
            \item $1$
            \item $\textcolor {red}\nexists $
          \end{enumerate}
        \end{multicols}
\end{enumerate}

\end{document}

尽管列创建正确,但最后一列仍为空。Frank 的平衡算法似乎为这个五 (5) 列布局提供了 4+4+4+4+0 平衡解决方案。我希望布局使用所有五列,因为总共有五个以上的项目。

我的问题是:

  1. 这真的是由于multicols平衡算法造成的吗,还是我的代码中缺少某些特定内容?
  2. 主要问题:有没有办法使用所有可用的列来平衡布局,例如 4+3+3+3+3,不需要使用\columnbreak
  3. 我尝试使用它\usepackage[balancingshow]{multicol}来查看平衡算法发生了什么,但跟踪输出仅显示 1-4 列的不良情况。这是正常的吗?

请注意,如果您评论最后一个\item,平衡解决方案是 3+3+3+3+3,它使用全部五 (5) 列。

我想要这个的动机是我正在创造一个非常个性化的问题/答案-type 包,答案应使用“尽可能少的空间”进行排版。当最后一列保持空白时,呈现效果似乎不太理想/自然。

我知道multicols“平衡算法”不可能对所有给定的情况都达到最佳效果,并且在大多数情况下它都能很好地完成工作,而且该包是为了排版文本而创建的。

答案1

这是一个解决方案,其中包含shortlst软件包和一个小补丁,以便能够选择列数。当然,它需要使用 shortlstsetspace来调整内衬和xkeyval。由于 shortlst 不在 TeXLive 或 MiKTeX 中(据我所知,由于其许可证问题),您必须从 CTAN 下载并将其安装在本地 texmf 目录中。

\documentclass[12pt, letterpaper]{article}
\usepackage[utf8]{inputenc} 
\usepackage[T1]{fontenc} 

\usepackage{amsmath,amsfonts,amssymb}
\usepackage{lmodern}
\usepackage[dvipsnames,svgnames,table]{xcolor}

\usepackage{shortlst,setspace,xkeyval}%
\makeatletter
\newcounter{ncol}
\define@key{lex}{nc}[5]{\setcounter{ncol}{#1}}%% 5 columns by default
\define@key{lex}{il}[1.5]{\def\@intln{#1}}% interlining![enter image description here][1]
\newenvironment{shortanswers}[1][]{%
\setkeys{lex}{nc,il,#1}
\settowidth{\labelwidth}{\mbox{(m)}}
\setlength{\leftmargini}{\dimexpr\labelwidth+\labelsep\relax}%[1][3]
\setlength{\shortitemwidth}{\dimexpr\textwidth/\value{ncol}-\labelwidth-2\labelsep\relax}%
\renewcommand{\labelenumi}{\ensuremath{(\alph{enumi})}}
`\setstretch{\@intln}
\begin{shortenumerate}}%
{\end{shortenumerate}
 }%
\makeatother

\begin{document}

\begin{enumerate}
\item%
      \begin{shortanswers}
        \item $ 0 $
        \item $ 0 $
        \item $ -1 $
        \item $-\infty $
        \item $\infty $
        \item $1$
        \item $2$
        \item $2$
        \item $1$
        \item $1$
        \item $2$
        \item $1$
        \item $0$
        \item $\textcolor {red}\nexists $
        \item $1$
        \item $\textcolor {red}\nexists $
      \end{shortanswers}
\end{enumerate}

\end{document}

结果是:

在此处输入图片描述

答案2

编辑(2017):不再使用 ,xintfrac因为 可以进行计算\numexpr。只需加载xinttools


我对造成这种压力的情况的猜测multicol是,当您想要D列、有N项目(将占据相同的垂直空间,想象一下简短的单词来简化)时,就会出现这种情况N\leq ceil(N/D)*(D-1)

例如N=16D=54*4=16。坏。D=73*6=18。坏。D=44*3=12好,D=63*5=15好,D=36*2=12好。

\input xinttools.sty % \xintApply, \xintListWithSep, \»intSeq
\def\GoodDivisions #1{For #1: 
    \xintListWithSep{, }{\xintApply{\TestGoodness {#1}}{\xintSeq {1}{#1}}}}

\def\Ceil #1#2{\numexpr(#1+#2/2-1)/#2\relax}

\catcode`@ 11
\long\def\@firstoftwo#1#2{#1}
\long\def\@secondoftwo#1#2{#2}

\def\TestGoodness #1#2{#2 is
                       \ifnum #1>\numexpr\Ceil{#1}{#2}*(#2-1)\relax
                       \expandafter\@firstoftwo
                       \else
                       \expandafter\@secondoftwo
                       \fi
                       {Good}{Bad}}
\catcode`@ 12

\GoodDivisions {16}

\GoodDivisions {20}

\GoodDivisions {32}

\GoodDivisions {23}

\nopagenumbers

\bye

这些预测未经检验!(至少适用于16和项目。20

良好的划分

这里现在有一张表格,其中给出了60多列中每个项目的数量,最多为兼容的选择D

良好划分表

\documentclass[a4paper]{article}
\usepackage[vscale=0.9]{geometry}
\usepackage{color}

\usepackage{xinttools}

\newcommand*\TestColumns[1]{%
  \xintListWithSep{&}{\xintApply{\TestGoodness {#1}}{123456789{10}}}%
}

\makeatletter
\newcommand*\TestGoodness[2]{%
  \ifnum #1>\numexpr\Ceil{#1}{#2}*(#2-1)\relax
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi G{\textcolor{red}{B}}%
}
\makeatother

\newcommand*\Ceil[2]{\numexpr(#1+#2/2-1)/#2\relax}

\begin{document}\thispagestyle{empty}

\begin{tabular}{c*{10}c}
  &1&2&3&4&5&6&7&8&9&10\\
\hline
\xintFor* #1 in {\xintSeq {1}{60}}
            \do {#1&\TestColumns {#1}\\}
\hline
\end{tabular}

\end{document}

相关内容