我目前正在使用嵌套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 平衡解决方案。我希望布局使用所有五列,因为总共有五个以上的项目。
我的问题是:
- 这真的是由于
multicols
平衡算法造成的吗,还是我的代码中缺少某些特定内容? - 主要问题:有没有办法使用所有可用的列来平衡布局,例如 4+3+3+3+3,不需要使用
\columnbreak
? - 我尝试使用它
\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=16
,D=5
给4*4=16
。坏。D=7
给3*6=18
。坏。D=4
给4*3=12
好,D=6
给3*5=15
好,D=3
给6*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}