突出显示缩进级别

突出显示缩进级别

我正在编写一份包含大量嵌套列表的参考文档。为了突出显示每个列表元素的缩进级别,我想在每个列表的每个标识级别上画一条细线。在我看来,它看起来像这样:

quick_example

我记得最接近的类似物是一个algorithmicx代码示例:

在此处输入图片描述

但我不知道如何用列表实现这一点;如果能提供任何想法我将不胜感激。

答案1

修订的解决方案(消除了参数选择的猜测)

经过这次修订,猜测过程被消除了,这是通过强制在嵌套列表中统一、和来实现的topsepparsep相反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}

相关内容