更加多功能(类似迷你页面)的盒子?

更加多功能(类似迷你页面)的盒子?

我想知道是否有更通用的 minipage 版本。目前,我需要一个具有特定垂直对齐特性和背景颜色的 minipage。因此,我将一个 minibox 嵌套在调整框中的颜色框中。(参见下面的示例。)这并不好。它很麻烦,而且语法不统一。

当然,人们总是可以制作自己的宏或环境,但我想知道是否有人已经制作了一个提供这种多功能盒子的包,例如

\begin{omnibox}[width=0.3\textwidth, bgcolor=red, valign=c]

语法很重要:目前,如果不查看每个包的文档,我就无法做任何事情。我记不清 colorbox 是否有环境版本;colorbox 是否使用“bgcolor=red”语法;它是否允许更改前景色;adjustbox 的参数是使用圆括号还是方括号;等等。

[编辑:请不要过多关注下面的示例。对于特定示例,您不需要adjustbox,因为minipage有一些垂直对齐选项,但minipage的功能并不包括adjustbox的所有选项。另一方面,我认为minipage对于固定宽度的文本框是必要的。但我不能100%确定adjustbox是否没有这个功能。]

以下是示例:

\documentclass{article}
\usepackage[export]{adjustbox}
\usepackage{xcolor}
\usepackage{lipsum}
\begin{document}
\begin{adjustbox}{valign=c}
  \colorbox{red}{%
    \begin{minipage}{0.3\textwidth}
      \lipsum[1]
    \end{minipage}%
  }
\end{adjustbox}
\begin{adjustbox}{valign=c}
  \colorbox{gray}{%
    \begin{minipage}{0.5\textwidth}
      \lipsum[2]
    \end{minipage}%
  }
\end{adjustbox}
\end{document}

[编辑:我添加了一些 % 来消除虚假间距。]

答案1

你似乎不需要adjustbox;这里有一个使用 的实现expl3

\documentclass{article}
\usepackage{xparse}
\usepackage{xcolor}
\usepackage{lipsum}

\ExplSyntaxOn

\NewDocumentEnvironment{omnibox}{m}
 {
  \keys_set:nn { ryo/omnibox } { #1 }
  \__ryo_omnibox_start:
 }
 {
  \__ryo_omnibox_end:
 }

\keys_define:nn { ryo/omnibox }
 {
  width .dim_set:N = \l__ryo_omnibox_width_dim,
  width .value_required:n = true,
  bgcolor .tl_set:N = \l__ryo_omnibox_bgcolor_tl,
  valign .tl_set:N = \l__ryo_omnibox_valign_tl,
  valign .initial:n = c,
 }
\box_new:N \l__ryo_omnibox_wrapper_box

\cs_new_protected:Nn \__ryo_omnibox_start:
 {
  \tl_if_empty:NF \l__ryo_omnibox_bgcolor_tl
   {
    \begin{lrbox}{\l__ryo_omnibox_wrapper_box}
   }
  \begin{minipage}[\l__ryo_omnibox_valign_tl]{\l__ryo_omnibox_width_dim}
 }
\cs_new_protected:Nn \__ryo_omnibox_end:
 {
  \end{minipage}
  \tl_if_empty:NF \l__ryo_omnibox_bgcolor_tl
   {
    \end{lrbox}
    \colorbox{\l__ryo_omnibox_bgcolor_tl}{\usebox{\l__ryo_omnibox_wrapper_box}}
   }
 }
\ExplSyntaxOff

\begin{document}

\begin{omnibox}{width=4cm,bgcolor=green}
\lipsum[2]
\end{omnibox}\quad
\begin{omnibox}{width=4cm,valign=t}
\lipsum[2]
\end{omnibox}\quad
\begin{omnibox}{width=4cm,valign=b,bgcolor=red}
\lipsum[2]
\end{omnibox}

\end{document}

在此处输入图片描述

为了实现前景色,lrbox在所有情况下都应使用。

\documentclass{article}
\usepackage{xparse}
\usepackage{xcolor}
\usepackage{lipsum}

\ExplSyntaxOn

\NewDocumentEnvironment{omnibox}{m}
 {
  \keys_set:nn { ryo/omnibox } { #1 }
  \__ryo_omnibox_start:
 }
 {
  \__ryo_omnibox_end:
 }

\keys_define:nn { ryo/omnibox }
 {
  width .dim_set:N = \l__ryo_omnibox_width_dim,
  width .value_required:n = true,
  bgcolor .tl_set:N = \l__ryo_omnibox_bgcolor_tl,
  fgcolor .tl_set:N = \l__ryo_omnibox_fgcolor_tl,
  valign .tl_set:N = \l__ryo_omnibox_valign_tl,
  valign .initial:n = c,
 }
\box_new:N \l__ryo_omnibox_wrapper_box

\cs_new_protected:Nn \__ryo_omnibox_start:
 {
  \begin{lrbox}{\l__ryo_omnibox_wrapper_box}
  \tl_if_empty:NF \l__ryo_omnibox_fgcolor_tl
   {
    \color{\l__ryo_omnibox_fgcolor_tl}
   }
  \begin{minipage}[\l__ryo_omnibox_valign_tl]{\l__ryo_omnibox_width_dim}
 }
\cs_new_protected:Nn \__ryo_omnibox_end:
 {
  \end{minipage}
  \end{lrbox}
  \tl_if_empty:NTF \l__ryo_omnibox_bgcolor_tl
   {
    \usebox{\l__ryo_omnibox_wrapper_box}
   }
   {
    \colorbox{\l__ryo_omnibox_bgcolor_tl}{\usebox{\l__ryo_omnibox_wrapper_box}}
   }
 }
\ExplSyntaxOff

\begin{document}

\begin{omnibox}{width=4cm,bgcolor=green,fgcolor=blue}
\lipsum[2]
\end{omnibox}\quad
\begin{omnibox}{width=4cm,valign=t}
\lipsum[2]
\end{omnibox}\quad
\begin{omnibox}{width=4cm,valign=b,bgcolor=red}
\lipsum[2]
\end{omnibox}

\end{document}

在此处输入图片描述

相关内容