Automatische Anpassung der Elementtrennung für gleichmäßigen Abstand

Automatische Anpassung der Elementtrennung für gleichmäßigen Abstand

Ich verwende derzeit enumitem und habe in einem Dokument eine Umgebung für meine Listen erstellt. Diese sieht wie folgt aus:

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

(obwohl ich nicht glaube, dass es für die Frage so wichtig ist)

und ich habe nach einer Möglichkeit gesucht, itemsep automatisch anzupassen, um zwischen allen Elementen den gleichen Abstand zu haben. Das ist, was ichnichtwill passieren:

Da der Bruch mehr Höhe verwendet, unterscheidet sich der Abstand zwischen ABC vom Abstand zwischen CDE und das sieht für mich seltsam aus. Meine aktuelle Lösung besteht darin, den optionalen Parameter in der Umgebung zu verwenden, um den Parameter itemsep manuell anzupassen und ihn so aussehen zu lassen:

Die manuelle Anpassung ist jedoch langsam und ich brauche einige weniger erfahrene Leute, um diese Umgebung zu nutzen. Gibt es eine Möglichkeit, itemsep automatisch auf den größten Abstand zwischen den Elementen einzustellen? Ich habe lange gesucht und konnte es nicht finden (vielleicht hat mein schlechtes Englisch nicht geholfen). Danke!

Antwort1

Meine vorgeschlagene Lösung besteht darin, die Höhe und Tiefe jedes Elements zu messen, um die maximale Höhe und Tiefe zu ermitteln. Bei Bedarf wird der Grundliniensprung auf die maximale Höhe plus die maximale Tiefe plus 2pt eingestellt.

\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}

Bildbeschreibung hier eingeben

Hier ist eine Version, die \hphantom{$-$}vor jedem Element, das nicht mit beginnt , einfügt $-, vorausgesetzt, dass mindestens eines mit beginnt.

\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}

Bildbeschreibung hier eingeben

Antwort2

Hier ist ein ganz anderer Ansatz, der auf einer Tabelle basiert. Ich habe eine leicht angepasste Version desautomatische Tabellenzeilennummerierung in Kombination mit dem cellspacePaket für den Abstand um die Einträge. Da ich die Spalte rechtsbündig ausgerichtet habe, scheint dies auch das Problem zu lösenIhre Folgefrage:

Bildbeschreibung hier eingeben

\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} 

verwandte Informationen