我正在编写一份包含大量嵌套列表的参考文档。为了突出显示每个列表元素的缩进级别,我想在每个列表的每个标识级别上画一条细线。在我看来,它看起来像这样:
我记得最接近的类似物是一个algorithmicx
代码示例:
但我不知道如何用列表实现这一点;如果能提供任何想法我将不胜感激。
答案1
修订的解决方案(消除了参数选择的猜测)
经过这次修订,猜测过程被消除了,这是通过强制在嵌套列表中统一、和来实现的topsep
。parsep
相反itemsep
,人们必须指定 9 个易于理解的参数,以及每个条形的颜色。
\tpset=2pt\relax% uniform \topset
\psep=2pt\relax% uniform \parsep
\itsep=2pt\relax% uniform \itemsep
\rlthk=2pt\relax% Colorbar thickness
\def\fixlm{20pt}% Fixed indent per itemize level
\def\bulhwd{2.29pt}% Half Width of "bullet"; controls L/R shift of colorbars
\def\botscale{1.0}% controls vertical extent of bottom of colorbar
\def\topscale{1.0}% controls vertical extent of top of colorbar
\def\mybullet{$\bullet$}% bullet of itemized list
这里的一个技巧是将label*
当前标签添加到(IE(右侧)是下一个更高级别的标签。因此,在 1 级标签中放置项目符号会使 2 级标签的左侧显示项目符号,依此类推。为了避免这种情况,我创建了\bul[]
仅在未传递可选参数时才打印项目符号的标签。因此,我只需确保 2、3、4 等级别的标签以可选参数(此处为[x]
)开头,以使上一级的尾随项目符号无效。太棒了!
在下面的 MWE 中,我演示了两组独立参数的结果。
\documentclass{article}
\usepackage{enumitem,xcolor}
\newlength\rlthk
\newlength\psep
\newlength\tpset
\newlength\itsep
%%%%%%%%%%%%%%%%%USER PARAMETERS
\tpset=2pt\relax% uniform \topset
\psep=2pt\relax% uniform \parsep
\itsep=2pt\relax% uniform \itemsep
\rlthk=2pt\relax% Colorbar thickness
\def\fixlm{20pt}% Fixed indent per itemize level
\def\bulhwd{2.29pt}% Half Width of "bullet"; controls L/R shift of colorbars
\def\botscale{1.1}% controls vertical extent of bottom of colorbar
\def\topscale{1.1}% controls vertical extent of top of colorbar
\def\mybullet{$\bullet$}% bullet of itemized list
%%%%%%%%%%%%%%%
\newcommand\rl[1][black]{\textcolor{#1}{%
\rule[-\allseps]{\rlthk}{%
\dimexpr\allseps-.3\baselineskip+\topscale\baselineskip+\topscale\psep+\topscale\tpset}}}
\newcommand\hs[1]{\hspace{#1}}
\newcommand\bul[1][\relax]{\ifx\relax#1\mybullet\fi}
\def\offlm{\dimexpr\bulhwd-0.5\rlthk\relax}
\def\modlm{\dimexpr\leftmargin-\bulhwd-.5\rlthk\relax}
\def\allseps{\dimexpr\tpset+\psep-.9\baselineskip+\botscale\baselineskip+\itemsep}
\setlist[itemize,1]{label*=\bul,
labelwidth=\fixlm,topsep=\tpset, parsep=\psep, itemsep=\itsep}
\setlist[itemize,2]{
label*=[x]\smash{ \rl[red]\hs{\modlm}}\bul,
leftmargin=\fixlm,topsep=\tpset, parsep=\psep, itemsep=\itsep}
\setlist[itemize,3]{
label*=[x]\smash{\hs{\offlm}\rl[blue]\hs{\modlm}}\bul,
leftmargin=\fixlm,topsep=\tpset, parsep=\psep, itemsep=\itsep}
\setlist[itemize,4]{
label*=[x]\smash{\hs{\offlm}\rl[green]\hs{\modlm}}\bul,
leftmargin=\fixlm,topsep=\tpset, parsep=\psep, itemsep=\itsep}
\begin{document}
\begin{itemize}
\item A1
\item A2
\begin{itemize}
\item B1
\begin{itemize}
\item C1
\begin{itemize}
\item D1
\item D2
\end{itemize}
\item C2
\end{itemize}
\item B2
\item B3
\end{itemize}
\item A3
\end{itemize}
\noindent\hrulefill
%%%%%%%%%%%%%%%%%USER PARAMETERS
\tpset=1pt\relax% uniform \topset
\psep=1pt\relax% uniform \parsep
\itsep=1pt\relax% uniform \itemsep
\rlthk=4pt\relax% Colorbar thickness
\def\fixlm{30pt}% Fixed indent per itemize level
\def\bulhwd{5.7pt}% Half Width of "bullet"; controls L/R shift of colorbars
\def\botscale{1}% controls vertical extent of bottom of colorbar
\def\topscale{1}% controls vertical extent of top of colorbar
\def\mybullet{\raisebox{-3pt}{\Huge$\bullet$}}% bullet of itemized list
%%%%%%%%%%%%%%%
\begin{itemize}
\item A1
\item A2
\begin{itemize}
\item B1
\begin{itemize}
\item C1
\begin{itemize}
\item D1
\item D2
\end{itemize}
\item C2
\end{itemize}
\item B2
\item B3
\end{itemize}
\item A3
\end{itemize}
\end{document}
原始解决方案(需要参数规范)
由于 topsep、parsep 和 itemsep 等参数默认会随着每个项目级别的增加而变化,因此控制颜色条位置的参数需要进行调整。但是,此解决方案比上面给出的完整解决方案更容易理解。
因此,每个级别的参数都需要一点猜测,但还不算太糟。一旦确定了每个级别的参数,它就可以使用正常的itemize
环境语法。
已针对颜色进行编辑
\documentclass{article}
\usepackage{enumitem,xcolor}
\def\rlthk{2pt}
\newcommand\rl[3][black]{\textcolor{#1}{\rule[-#2pt]{\rlthk}{#3\baselineskip}}}
\newcommand\hs[1]{\hspace{#1pt}}
\newcommand\bul[1][\relax]{\ifx\relax#1$\bullet$\fi}
\begin{document}
\setlist[itemize,1]{label*=\bul}
\setlist[itemize,2]{label*=[x]\smash{ \rl[red] {14.5}{2.9}\hs{18.9}}\bul}
\setlist[itemize,3]{label*=[x]\smash{\hs{1.4}\rl[blue] {10.5}{2.2}\hs{15.4}}\bul}
\setlist[itemize,4]{label*=[x]\smash{\hs{1.2}\rl[green]{09.0}{1.9}\hs{13.8}}\bul}
\begin{itemize}
\item A1
\item A2
\begin{itemize}
\item B1
\begin{itemize}
\item C1
\begin{itemize}
\item D1
\item D2
\end{itemize}
\item C2
\end{itemize}
\item B2
\item B3
\end{itemize}
\item A3
\end{itemize}
\end{document}
答案2
这是一个可能的解决方案,tikzmark
这里使用并\VerticalLine
定义它采用代码中定义的 3 个参数作为注释。
代码
\documentclass{article}
\usepackage[left=3in,top=2in]{geometry}
\usepackage{tikz,amsmath,enumitem}
%
\setlist{nosep,before=\vspace{\baselineskip},after=\vspace{\baselineskip}}
\newcommand{\tikzmarkA}[1]{\tikz[overlay,remember picture,] \node[xshift=2pt] (#1) {};}
\newcommand\VerticalLine[3][]{%
% #1 = draw options
% #2 = top mark
% #3 = bottom mark
\draw[#1]
(#2) -- (#2 |- #3);
}
\begin{document}
\begin{itemize}
\item[$\bullet$] indent level one
\item[$\bullet$] indent level one
\item[\tikzmarkA{a1}$\bullet$] indent level one
\begin{itemize}
\item[$\bullet$] indent level two
\item[$\bullet$] indent level two
\item[\tikzmarkA{a2}$\bullet$] indent level two
\begin{itemize}
\item[$\bullet$] indent level three
\item[$\bullet$] indent level three
\item[\tikzmarkA{a3}$\bullet$] indent level three
\begin{itemize}
\item[$\bullet$] indent level four
\item[$\bullet$] indent level four
\item[\tikzmarkA{a4}$\bullet$] indent level four
\end{itemize}
\end{itemize}
\end{itemize}
\end{itemize}
\begin{tikzpicture}[overlay,remember picture]
\VerticalLine[ultra thick,gray]{a1}{a4}
\VerticalLine[ultra thick,blue]{a2}{a4}
\VerticalLine[ultra thick,red]{a3}{a4}
\end{tikzpicture}
\end{document}