自动调整项目间距以实现相等间距

自动调整项目间距以实现相等间距

我目前正在使用 enumitem,并在文档中为我的列表创建了一个环境。它如下:

\newenvironment{alternativas}[1][0]
{
    \begin{enumerate}[label={\Alph*)}, itemsep=#1cm, topsep = 0.5cm, wide=0pt,labelwidth=.5cm,leftmargin=!]
}
{
    \end{enumerate}
}

(尽管我认为这对这个问题来说没那么重要)

我一直在寻找一种方法来自动调整 itemsep 以使所有项目之间的间距相等。这就是我希望发生:

由于分数使用了更多的高度,ABC 之间的间距与 CDE 之间的间距不同,这对我来说看起来很奇怪。我目前的解决办法是使用环境中的可选参数手动调整 itemsep 参数,使其看起来像这样:

但是手动调整速度很慢,我需要一些经验不足的人来使用这个环境。有没有办法让 itemsep 自动设置为项目之间的最大间隔?我搜索了很多,但找不到(可能是我的英语不好帮不上忙)。谢谢!

答案1

我提出的解决方案是测量每个项目的高度和深度,以便获得最大高度和深度。如有必要,基线跳跃设置为最大高度加上最大深度加上 2pt。

\documentclass{article}
\usepackage{xparse,enumitem,amsmath}

\ExplSyntaxOn

\NewDocumentCommand{\alternatives}{m}
 {
  \blaz_alternativas:n { #1 }
 }

\seq_new:N \l__blaz_alternativas_seq
\box_new:N \l__blaz_alternativas_item_box
\dim_new:N \l__blaz_alternativas_height_dim
\dim_new:N \l__blaz_alternativas_depth_dim

\cs_new_protected:Nn \blaz_alternativas:n
 {
  % first populate the sequence of items
  \seq_set_split:Nnn \l__blaz_alternativas_seq { \\ } { #1 }
  % now measure the heights and depths
  \dim_zero:N \l__blaz_alternativas_height_dim
  \dim_zero:N \l__blaz_alternativas_depth_dim
  \seq_indexed_map_inline:Nn \l__blaz_alternativas_seq
   {
    % set the box to the current item
    \hbox_set:Nn \l__blaz_alternativas_item_box { ##2 }
    % measure the height if not the first item
    \int_compare:nT { ##1 > 1 }
     {
      \dim_set:Nn \l__blaz_alternativas_height_dim
       {
        \dim_max:nn { \l__blaz_alternativas_height_dim }
                    { \box_ht:N \l__blaz_alternativas_item_box }
       }
     }
    % measure the depth if not the last item
    \int_compare:nT { ##1 < \seq_count:N \l__blaz_alternativas_seq }
     {
      \dim_set:Nn \l__blaz_alternativas_depth_dim
       {
        \dim_max:nn { \l__blaz_alternativas_depth_dim }
                    { \box_dp:N \l__blaz_alternativas_item_box }
       }
     }
   }
   \begin{enumerate}[label={\Alph*)},wide=0pt,labelwidth=.5cm,leftmargin=!,itemsep=0pt]
   % set the baselineskip
   \skip_set:Nn \baselineskip
    {
     \dim_max:nn { \baselineskip }
                 { \l__blaz_alternativas_height_dim + \l__blaz_alternativas_depth_dim }
     + 2pt
    }
   % deliver the items
   \seq_map_inline:Nn \l__blaz_alternativas_seq { \item ##1 }
   \end{enumerate}
 }

\ExplSyntaxOff

\begin{document}

\alternatives{ $1$ \\ $2$ \\ $3$ \\ $4$ \\ $5$ }

\alternatives{
  $1$ \\
  $\dfrac{3}{2}$ \\
  $\dfrac{3}{4}$ \\
  $4$ \\
  $5$
}

\end{document}

在此处输入图片描述

这是一个版本,它\hphantom{$-$}在每个不以 开头的项目前面添加$-,只要至少有一个以 开头。

\documentclass{article}
\usepackage{xparse,enumitem,amsmath}

\ExplSyntaxOn

\NewDocumentCommand{\alternatives}{m}
 {
  \blaz_alternativas:n { #1 }
 }

\seq_new:N \l__blaz_alternativas_seq
\box_new:N \l__blaz_alternativas_item_box
\dim_new:N \l__blaz_alternativas_height_dim
\dim_new:N \l__blaz_alternativas_depth_dim

\cs_new_protected:Nn \blaz_alternativas:n
 {
  % first populate the sequence of items
  \seq_set_split:Nnn \l__blaz_alternativas_seq { \\ } { #1 }
  % now measure the heights and depths
  \dim_zero:N \l__blaz_alternativas_height_dim
  \dim_zero:N \l__blaz_alternativas_depth_dim
  \seq_indexed_map_inline:Nn \l__blaz_alternativas_seq
   {
    % set the box to the current item
    \hbox_set:Nn \l__blaz_alternativas_item_box { ##2 }
    % measure the height if not the first item
    \int_compare:nT { ##1 > 1 }
     {
      \dim_set:Nn \l__blaz_alternativas_height_dim
       {
        \dim_max:nn { \l__blaz_alternativas_height_dim }
                    { \box_ht:N \l__blaz_alternativas_item_box }
       }
     }
    % measure the depth if not the last item
    \int_compare:nT { ##1 < \seq_count:N \l__blaz_alternativas_seq }
     {
      \dim_set:Nn \l__blaz_alternativas_depth_dim
       {
        \dim_max:nn { \l__blaz_alternativas_depth_dim }
                    { \box_dp:N \l__blaz_alternativas_item_box }
       }
     }
   }
   \begin{enumerate}[label={\Alph*)},wide=0pt,labelwidth=.5cm,leftmargin=!,itemsep=0pt]
   % set the baselineskip
   \skip_set:Nn \baselineskip
    {
     \dim_max:nn { \baselineskip }
                 { \l__blaz_alternativas_height_dim + \l__blaz_alternativas_depth_dim }
     + 2pt
    }
   % check whether some items start with $-
   \cs_set_protected:Nn \__blaz_alternativas_minus:n {##1} % do nothing by default
   \seq_map_inline:Nn \l__blaz_alternativas_seq
    {
     \regex_match:nnT { \A \$\- } { ##1 }
      {
       \seq_map_break:n
        {
         \cs_set_eq:NN \__blaz_alternativas_minus:n \__blaz_alternativas_addminus:n
        }
      }
    }
   % deliver the items
   \seq_map_inline:Nn \l__blaz_alternativas_seq { \item \__blaz_alternativas_minus:n {##1} }
   \end{enumerate}
 }
\cs_new_protected:Nn \__blaz_alternativas_addminus:n
 {
  \regex_match:nnF { \A \$\- } { #1 } { \hphantom{$-$} } #1
 }

\ExplSyntaxOff

\begin{document}

\alternatives{ $1$ \\ $2$ \\ $3$ \\ $4$ \\ $5$ }

\alternatives{
  $-1$ \\
  $-\dfrac{3}{2}$ \\
  $\dfrac{3}{4}$ \\
  $4$ \\
  $5$
}

\end{document}

在此处输入图片描述

答案2

这是基于表格的完全不同的方法。我使用了略微改编的版本自动表格行编号cellspace与条目周围的间距包 结合使用。由于我将列右对齐,这似乎也解决了你的后续问题

在此处输入图片描述

\documentclass{article}
\usepackage[column=0]{cellspace}
\setlength\cellspacetoplimit{6pt}
\setlength\cellspacebottomlimit{\cellspacetoplimit}

\usepackage{array,etoolbox}
\preto\tabular{\setcounter{magicrownumbers}{0}}
\newcounter{magicrownumbers}
\newcommand\rownumber{\stepcounter{magicrownumbers}\Alph{magicrownumbers}}
\usepackage{amsmath}

\newenvironment{myalternatives}[1][0]
{\begin{tabular}{@{\makebox[3em][r]{\rownumber)~}}  >{$}0r<{$}}}
{\end{tabular}}

\begin{document}

\begin{myalternatives}
  1 \\
  \dfrac{3}{2} \\
  \dfrac{3}{4} \\
  4 \\
  5 \\
  -6\\
\end{myalternatives}

\end{document} 

相关内容