Подробная таблица макетов

Подробная таблица макетов

быстрый вопрос: я скопировал этот код:

\documentclass{article}
\usepackage{amsmath,amssymb,calc}
\def\horizlist#1#2#3{%
  \setcounter{enumi}{0}%
  #3%
  \flushleft
  \newlength\stringlength
  \setlength\stringlength{#2}
  \advance\stringlength by #1 \relax
  \def\item{\hfil\egroup\penalty50 \hfill
  \refstepcounter{enumi}%
  \leavevmode\hbox to \stringlength \bgroup\space(\theenumi)\space}
  \leavevmode\bgroup\hskip 0pt plus -1fill }

\def\endhorizlist{\hfil\egroup\endflushleft}

\begin{document}
\begin{enumerate}
\item blah
    \begin{horizlist}{2cm}{\widthof{null}}{\renewcommand\theenumi{\alph{enumi}}}
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \end{horizlist}
\end{enumerate}
\end{document}

Он делает то, что должен делать, единственная проблема в том, что последний элемент появляется справа, а не примыкает к своему предыдущему элементу слева. Как это исправить? Чтобы прояснить проблему:

Вывод такой:

введите описание изображения здесь

Я хочу это:

введите описание изображения здесь

Любая помощь?

решение1

Вам нужно будет отслеживать текущий столбец. Я считаю, что проще (и гибче) сделать все это, определив окружение horizlistкак tabular. Таким образом, вы можете не только использовать \itemвместо &/ \\, но и указать выравнивание по желанию (второй аргумент env horizlist).

\documentclass{article}
\usepackage{calc}

\newcount\horizlistcount
\newenvironment{horizlist}[2]{%
  \setcounter{enumi}{0}%
  \renewcommand\theenumi{\alph{enumi}}%
  \def\nextsep{}%
  \global\horizlistcount=#1
  \def\item{%
    \nextsep
    \refstepcounter{enumi}(\theenumi)
    \ifnum\horizlistcount=0 \global\horizlistcount=#1 \fi
    \global\advance\horizlistcount-1
    \ifnum\horizlistcount=0 \def\nextsep{\\}\else\def\nextsep{&}\fi
  }%
  \begin{tabular}[t]{*{#1}{#2}}
}{%
  \end{tabular}
}

\begin{document}
\begin{enumerate}
\item blah
    \begin{horizlist}{4}{p{\widthof{null}+2cm}}
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \end{horizlist}
\end{enumerate}
\end{document}

Результат

(Чтобы перейти на новую строку перед встроенной таблицей, просто произнесите \\перед ней или включите ее в определение.)

решение2

Не полностью автоматизировано, но делает то, что вам нужно. Мы вводим команду \noitem, которая вставляет "фантомный элемент". Неавтоматизированность в том, что мы заранее не знаем, сколько их \noitemsдолжно быть.

\documentclass{article}
\usepackage{amsmath,amssymb,calc}
\def\horizlist#1#2#3{%
  \setcounter{enumi}{0}%
  #3%
  \flushleft
  \newlength\stringlength
  \setlength\stringlength{#2}
  \advance\stringlength by #1 \relax
  \def\item{\hfil\egroup\penalty50 \hfill
  \refstepcounter{enumi}%
  \leavevmode\hbox to \stringlength \bgroup\space(\theenumi)\space}
  \def\noitem{\hfil\egroup\penalty50 \hfill
  \leavevmode\hbox to \stringlength \bgroup}
  \leavevmode\bgroup\hskip 0pt plus -1fill }

\def\endhorizlist{\hfil\egroup\endflushleft}

\begin{document}
\begin{enumerate}
\item blah
    \begin{horizlist}{2cm}{\widthof{null}}{\renewcommand\theenumi{\alph{enumi}}}
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \item null
    \noitem\noitem
    \end{horizlist}
\end{enumerate}
\end{document}

Связанный контент