我想要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
为盒装\parbox
或varwidth
盒子(适当的最大限度宽度):
\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 以允许在\item
s 的基线周围留出适当的间距。
当然,由于所有项目都被装箱,它们不会跨越页面边界。