我在 tcolorbox 里面有一个列表环境,我想对缩进进行一些控制,因为有时我在里面使用多列,由于项目的缩进较大,它会产生奇怪的结果。
\documentclass{standalone}
\usepackage{tcolorbox}
\usepackage{multicol}
\newtcolorbox{objbox}[1] {colback=red!5!white,colframe=red!75!black,fonttitle=\bfseries,title=#1, before skip=0.5cm, after skip=0.5cm} %
\newenvironment{objectives}{%
\begin{objbox}{Objectives:} \begin{list}{\(\bullet\)}{}%
}{%
\end{list} \end{objbox}%
}%
\begin{document}
\begin{objectives}
\item foo:
\begin{multicols}{2}
\item one
\item two
\end{multicols}
\end{objectives}
\end{document}
如果可能的话,我希望它有一个可选参数来控制距离,当为空时设置一个默认值,但我很乐意使用一个命令来改变整个文档的距离。
答案1
这里有三种解决方案:一种使用 的参数enumitem
(主要是wide
选项)和multicols
,第二种基于tasks
包,最后一种使用shortlst
包,该包在 CTAN 上可用,但不是 TeX Live 或 MiKTeX 的包(出于许可原因)。如果某个项目溢出到下一列,shortlst 会自动完成,但它不会管理需要多行的项目。对于这种情况,我必须定义一个\paritem
,它定义一个\parbox
带有可选参数的命令,即它将分布在的列数,以及一个强制参数,即它的内容。
\documentclass{article}
\usepackage{enumitem}
\usepackage{tasks}
\usepackage{tcolorbox}
\usepackage{multicol}
\usepackage{shortlst, setspace}
\newenvironment{boxeditemize}[1][3]{\settowidth{\labelwidth}{\mbox{\textbullet}}%
\setlength{\leftmargini}{\dimexpr\labelwidth+\labelsep\relax}%
\setlength{\shortitemwidth}{\dimexpr\linewidth/#1-\labelwidth-2\labelsep\relax}%
\begin{shortitemize}}%{1.333}
{\end{shortitemize}}%
%%
\newtcolorbox{objbox}[1] {colback=red!5!white,colframe=red!75!black,fonttitle=\bfseries,title=#1, before skip=0.5cm, after skip=0.5cm} %
\newenvironment{myobjectives}{%
\begin{objbox}{Objectives: (with \texttt{enumitem})} \begin{itemize}[wide=0pt, leftmargin =*]%
}{%
\end{itemize} \end{objbox}%
}%
\newenvironment{otherobjectives}[1][3]{%
\begin{objbox}{Objectives (with \texttt{shortlst})}%
\begin{boxeditemize}[#1]
}{%
\end{boxeditemize} \end{objbox}%
}%
\newcommand\paritem[2][1]{\item \parbox[t]{#1\shortitemwidth}{#2\medskip}}
\begin{document}
\begin{myobjectives}
\item foo:
\begin{multicols}{2}
\item one
\item two
\end{multicols}
\end{myobjectives}
\par
\begin{objbox}{Objectives: (with \texttt{tasks})}\settasks{style = itemize, item-indent = 0em, label-offset =-0.2em, before-skip = -1.5ex, after-skip =-3ex}%
\begin{tasks}(2)
\task* foo:
\task one
\task two
\end{tasks}
\end{objbox}
\begin{otherobjectives}[2]\setstretch{2.5}
\item foo:
\item one
\item two
\end{otherobjectives}
\begin{otherobjectives}[2]
\item foo;
\paritem[2] {Bla bla bla bla bla. Bla bla bla bla bla. Bla bla bla bla bla. Bla bla bla bla bla. }
\paritem{Bli bli bli bli bli. Bli bli bli bli bli. Bli bli bli bli bli. Bli bli bli bli bli. Bli bli bli bli bli. }
\item one
\item two
\end{otherobjectives}
\end{document}
答案2
如果您确实指的是和之间的水平空间one
,two
您可以尝试将 multicol 放在具有设定宽度的 parbox 内,例如像这样:
\documentclass{standalone}
\usepackage{tcolorbox}
\usepackage{multicol}
\newtcolorbox{objbox}[1] {colback=red!5!white,colframe=red!75!black,fonttitle=\bfseries,title=#1, before skip=0.5cm, after skip=0.5cm} %
\newenvironment{objectives}{%
\begin{objbox}{Objectives:} \begin{list}{\(\bullet\)}{}%
}{%
\end{list} \end{objbox}%
}%
\begin{document}
\begin{objectives}
\item foo: % empty line below this is important
\parbox{5cm}{
\begin{multicols}{2}
\item one
\item two
\end{multicols}
}
\end{objectives}
\end{document}