在具有自动缩放宽度的框中逐项列出

在具有自动缩放宽度的框中逐项列出

我想要itemize一个带有方框的列表 ()。我知道这\framebox行不通,因为它不支持换行。另外我不想使用,\parbox因为我必须自己设置宽度。我正在做一些有大量方框的工作,因此我不想总是关心宽度。它应该自动缩放,就像\framebox它一样。

编辑:

我所做的如下:(到目前为止)[您需要包含 \usepackage{minibox} 包]

\newcommand{\ltwo}[2] { \framebox{\minibox{$\bullet$ #1 \\ $\bullet$ #2}}}
\newcommand{\lthree}[3] { \framebox{\minibox{$\bullet$ #1 \\ $\bullet$ #2 \\ $\bullet$ #3}}}

\newcommand{\lfour}[4] { \framebox{\minibox{$\bullet$ #1 \\ $\bullet$ #2 \\ $\bullet$ #3 \\ $\bullet$ #4}}}

因此我写道:

\lthree{Hello}{The width will adjust to the width of this line}{ but not this}

我知道我可以编写递归宏,但是我目前还缺乏经验。

答案1

你可以使用一些技巧宏捕获直到行尾作为参数捕获每一个\item并进行处理。

下面我提供了\boxitem\varboxitem每个处理\item为盒装\parboxvarwidth盒子(适当的最大限度宽度):

在此处输入图片描述

\documentclass{article}
\usepackage{xparse,environ,varwidth}
\usepackage[nopar]{lipsum}

\ExplSyntaxOn
\NewEnviron{myitemize}[1][]
 {
  \keys_set:nn { xotix/itemize } { #1 }
  \seq_set_split:NnV \l_xotix_itemize_input_seq { \item } \BODY
  \seq_pop_left:NN \l_xotix_itemize_input_seq \l_tmpa_tl
  \tl_use:N \l_xotix_itemize_pre_tl
  \seq_set_map:NNn
    \l_xotix_itemize_output_seq
    \l_xotix_itemize_input_seq
    { \exp_not:n { \__xotix_itemize_do:n { ##1 } } }
  \seq_use:NV \l_xotix_itemize_output_seq \l_xotix_itemize_sep_tl
  \tl_use:N \l_xotix_itemize_post_tl
 }

\seq_new:N \l_xotix_itemize_input_seq
\seq_new:N \l_xotix_itemize_output_seq
\cs_generate_variant:Nn \seq_set_split:Nnn { NnV }
\cs_generate_variant:Nn \seq_use:Nn { NV }

\keys_define:nn { xotix/itemize }
 {
  pre  .tl_set:N = \l_xotix_itemize_pre_tl,
  post .tl_set:N = \l_xotix_itemize_post_tl,
  sep  .tl_set:N = \l_xotix_itemize_sep_tl,
  action .code:n = \cs_set_eq:NN \__xotix_itemize_do:n #1,
  action .initial:n = \use:n,
 }
\ExplSyntaxOff

\NewDocumentCommand{\boxitem}{m}{%
  \item \fbox{\parbox[t]{\dimexpr\linewidth-2\fboxsep-2\fboxrule}{\strut #1\strut}}%
}

\NewDocumentCommand{\varboxitem}{m}{%
  \item \fbox{\begin{varwidth}[t]{\dimexpr\linewidth-2\fboxsep-2\fboxrule}
    \strut #1\strut
  \end{varwidth}}%
}

\begin{document}

\begin{myitemize}[
    action=\boxitem,
    pre=\begin{itemize},
    post=\end{itemize},
  ]
  \item First
  \item Second
  \item Last
\end{myitemize}

\begin{myitemize}[
    action=\varboxitem,
    pre=\begin{itemize},
    post=\end{itemize},
  ]
  \item First
  \item Second
  \item Last
\end{myitemize}

\clearpage

\begin{myitemize}[
    action=\boxitem,
    pre=\begin{itemize},
    post=\end{itemize},
  ]
  \item First
  \item \lipsum[2]
  \item Last
\end{myitemize}

\begin{myitemize}[
    action=\varboxitem,
    pre=\begin{itemize},
    post=\end{itemize},
  ]
  \item First
  \item \lipsum[2]
  \item Last
\end{myitemize}


\end{document}

\boxitem(使用\parbox)将其内容设置在固定宽度的框中,而当\varwidthbox内容小于指定的最大宽度时可能会缩小。\strut添加了 s 以允许在\items 的基线周围留出适当的间距。

当然,由于所有项目都被装箱,它们不会跨越页面边界。

相关内容