希望这很简单:我有一个相对较长的列表,其中每个列表项包含很少的文本。例如:
* A * b * C *d *e * F
我希望将其格式化如下:
*一个*b*c *d*e*f
在乳胶中做到这一点的最佳方法是什么?
我已经看到许多关于以其他方式执行此操作的问题: 将 itemize 拆分为多个列或者https://stackoverflow.com/questions/1398127/breaking-a-list-into-multiple-columns-in-latex。但我不知道如何先从左到右再向下扩展我的列表,而不是先向下再从左到右。
答案1
这里有两种可能性:使用tasks
,如@Jhor 的评论中所述,以及shortlst
由于许可原因不在 TeX Live 或 MiKTeX 中的包,您必须从 CTAN 下载并自行安装(在本地 TeXMF 根目录中)。我修补了后一个包,以便环境可以通过一组键接受可选参数,以选择列数(默认为 3)和内衬(默认为 1.5)。
一个区别是,对于内容较长的项目,tasks
会将内容包装在列中(并且您必须通过命令要求它分布在几列上\task*
),而shortlst
这是自动执行的,我必须定义一个\paritem
命令将其包装在其列中(或几列,但带有可选参数的固定数量的列)。
如果您想对枚举列表执行相同操作,还有另外两个包:tablists
和multenum
(后者的语法不同 - 它是用tabular
环境定义的)。包也有可能listliketab
。
例子:
\documentclass[12pt]{article}%
\usepackage[utf8]{inputenc}
\usepackage{showframe}
\renewcommand{\ShowFrameLinethickness}{0.3pt}
\usepackage{tasks}
\usepackage{shortlst,setspace,xkeyval, tasks}%
\makeatletter
\newcounter{ncol}
\define@key{lex}{nc}[3]{\setcounter{ncol}{#1}}%% 3 columns by default
\define@key{lex}{il}[1.5]{\def\@intln{#1}}% interlining![1]
\newenvironment{tabitemise}[1][]{%
\setkeys{lex}{nc,il,#1}
\settowidth{\labelwidth}{\mbox{\textbullet}}
\setlength{\leftmargini}{\dimexpr\labelwidth+\labelsep\relax}%[1][3]
\setlength{\shortitemwidth}{\dimexpr\linewidth/\value{ncol}-\labelwidth-2\labelsep\relax}%
\renewcommand{\labelenumi}{(\alph{enumi})}
\setstretch{\@intln}
\begin{shortitemize}}%
{\end{shortitemize}
}%
\newcommand\paritem[2][1]{\item \parbox[t]{#1\shortitemwidth}{\setstretch{1}#2\medskip}}%%for a longer item content,
\makeatother
\begin{document}
\begin{tabitemise}[nc = 3]
\item a
\item b
\item c
\paritem{A somewhat longer contents here}
\item This one has to spread over two columns
\item d
\item e
\item f
\end{tabitemise}
\bigskip
\begin{tasks}[style=itemize, label-offset=0.em](3)%
\task a
\task b
\task c
\task A somewhat longer contents here
\task* This one has to spread over two columns
\task d
\task e
\task f
\end{tasks}
\end{document}