使用 TikZ 嵌套标记彩色框

使用 TikZ 嵌套标记彩色框

我需要嵌套框,因为它们显示在这个问题,而是彩色的。

我尝试了两种解决方案。使用shapes.multipart命令生成节点部分时,我完全失败了foreach。如果我\tikz在一个节点部分中使用多个部分,我可以使用foreach,但我无法将它们放在一列中(尝试矩阵,失败了)。

drsxcolor几乎得到了正确的结果,但是当我写下这个时:

\documentclass{article}

\usepackage{drs}
\usepackage{xcolor}

\begin{document}

\colorbox{green}
{
    \drs{box label}
        {
            drs box text
        }
}

\end{document}

生成的框周围的一些边缘drs也被着色了。

我基本上需要绘制一个带有标签的彩色框。然后通过循环foreach在里面生成几个彩色框。完全可以将它们放在一列中。

根据 egreg 的建议,我写了这篇文章:

\documentclass{article}

\newcommand{\zcolorbox}[2]{{\setlength{\fboxsep}{0pt}\colorbox{#1}{#2}}}
\newcommand{\nestedbox}[3]{\zcolorbox{#1}{\drs{#2}{#3}}}

\usepackage{drs}
\usepackage{xcolor}

\begin{document}

\nestedbox{green}{box label}{\nestedbox{yellow}{inner box label}{inner box text}}

\end{document}

并得到这个:

彩色嵌套 drs 框,fboxsep 设置为 0

我怎样才能去除那里的黄色,但不去除空间?

答案1

我开一个小讨论。

这里提供一种使用 LaTeX3 并结合内核 LaTeX2e 中定义的一些功能的方法。

您的颜色框的输入如下:

\nestedbox[<options>]{<header>}{<inner box>}

其中inner box是一个逗号分隔的列表。

可用选项包括:

  • outer-color设置整个框的背景颜色
  • inner-color设置内框的背景
  • bgcolor集合inner-colorouter-color
  • line-color设置框架的颜色
  • margin为最宽的单词添加额外的空格
  • alignment选择框的对齐方式。可用的有leftrightcenter
  • header-font设置标题的字体
  • label-font设置内部框的字体

完整的代码在这里。

\documentclass{article}
\usepackage{expl3,xparse}
\usepackage{xcolor}
\ExplSyntaxOn
\keys_define:nn { colorbox }
  {
    outer-color  .tl_set:N   = \l_colorbox_outercolor_tl,
    inner-color  .tl_set:N   = \l_colorbox_innercolor_tl,
    line-color    .tl_set:N   = \l_colorbox_linecolor_tl,
    bgcolor       .meta:n    = { outer-color = #1 , inner-color = #1 },
    margin       .dim_set:N = \l_colorbox_margin_dim,
  }
\keys_set:nn { colorbox } { bgcolor = white , line-color = black , margin = 20pt }

\tl_new:N  \l_colorbox_left_align_tl 
\tl_new:N  \l_colorbox_right_align_tl
\keys_define:nn { colorbox }
 {
  alignment .choice:,
  alignment / left   .code:n = {
                                             \tl_set:Nn  \l_colorbox_left_align_tl {\null} 
                                             \tl_set:Nn  \l_colorbox_right_align_tl {\hfill}
                                            },
  alignment / right .code:n = {
                                             \tl_set:Nn  \l_colorbox_left_align_tl {\hfill} 
                                             \tl_set:Nn  \l_colorbox_right_align_tl {\null}
                                            },
  alignment / center .code:n = {
                                             \tl_set:Nn  \l_colorbox_left_align_tl {\hfill} 
                                             \tl_set:Nn  \l_colorbox_right_align_tl {\hfill}
                                            },
 }
\keys_set:nn { colorbox } { alignment = center }

\keys_define:nn { colorbox }
  {
    header-font .tl_set:N   = \l_colorbox_headerfont_tl,
    label-font    .tl_set:N   = \l_colorbox_labelfont_tl,
  }
\keys_set:nn { colorbox } { header-font = \bfseries , label-font=\normalfont }
%#1 = options
%#2 = top label
%#3 = inner boxes clist
\clist_new:N \l_colorbox_innerbox_clist
\tl_new:N     \l_colorbox_boxlabel_tl
\dim_new:N \l_colorbox_widthest_label_dim
\NewDocumentCommand \nestedbox { O{} m m }
 {
  \keys_set:nn { colorbox } {#1}
  \tl_set:Nn      \l_colorbox_boxlabel_tl     { #2 }
  \clist_set:Nn  \l_colorbox_innerbox_clist { #3 }
  \clist_if_empty:NTF \l_colorbox_innerbox_clist
    {
      \fcolorbox { \l_colorbox_linecolor_tl   }
                     { \l_colorbox_outercolor_tl }
                     { \tl_use:N  \l_colorbox_boxlabel_tl }
     }   
    {
       \colorbox_find_widthest_label:NN \l_colorbox_boxlabel_tl \l_colorbox_innerbox_clist
       \colorbox_output_inner_label:NN  \l_colorbox_boxlabel_tl \l_colorbox_innerbox_clist
    }
 }

\cs_new:Npn \colorbox_find_widthest_label:NN #1#2
 {
   \hbox_set:Nn \l_tmpa_box { \tl_use:N #1}
   \dim_set:Nn   \l_colorbox_widthest_label_dim { \box_wd:N \l_tmpa_box }
   \clist_map_inline:Nn #2
    {
      \hbox_set:Nn \l_tmpa_box { ##1 }
      \dim_compare:nNnT 
         { \box_wd:N \l_tmpa_box } > { \l_colorbox_widthest_label_dim }
         {  \dim_set:Nn   \l_colorbox_widthest_label_dim { \box_wd:N \l_tmpa_box } }
    }
%    \dim_use:N \l_colorbox_widthest_label_dim
  }

\cs_new:Npn \colorbox_output_inner_label:NN #1#2
 {
   \fcolorbox { \l_colorbox_linecolor_tl   }
                  { \l_colorbox_outercolor_tl }
                  { 
                    \begin{minipage}
                         {\dim_eval:w      \l_colorbox_widthest_label_dim 
                                              +  \l_colorbox_margin_dim  
                                              +  2\fboxsep +2\fboxrule
                           \dim_eval_end: }
                        \centering %\offinterlineskip
                        \hbox_to_wd:nn 
                            {\l_colorbox_widthest_label_dim +  \l_colorbox_margin_dim } 
                            {
                              \l_colorbox_left_align_tl
                              \l_colorbox_headerfont_tl
                              \strut \tl_use:N  #1
                              \l_colorbox_right_align_tl
                             }  
                        \tex_vrule:D width \linewidth height 0pt \scan_stop:
                        \clist_map_inline:Nn #2 
                         { \\\nointerlineskip
                              \fcolorbox 
                                              { \l_colorbox_innercolor_tl }
                                              { \l_colorbox_innercolor_tl }
                                              { \hbox_to_wd:nn 
                                                        {\l_colorbox_widthest_label_dim +  \l_colorbox_margin_dim } 
                                                        {
                                                         \l_colorbox_left_align_tl 
                                                          \l_colorbox_labelfont_tl
                                                          \strut ##1  
                                                          \l_colorbox_right_align_tl
                                                         } 
                                               }
                         }
                     \end{minipage}    
                   }                                                  
  }

\ExplSyntaxOff
\begin{document}

\nestedbox{box label}{inner,foo, long long long text}

\nestedbox[inner-color=yellow,outer-color=green]{box label}{inner,foo, long long long text}

\nestedbox[inner-color=red!20,alignment=left,label-font=\itshape]{box label}{inner,foo, long long long text}
\end{document}

在最终的 pdf 中,内部框之间没有线。

答案2

您的代码产生了预期的结果。您必须记住,TeX 是一个排版引擎,因此空格通常是不是和大多数编程语言一样,行尾字符会被忽略。行尾字符相当于空格(除非一行中有两个空格,从而生成段落结束命令)。

行尾可以用%字符掩盖,因此对代码的第一个调整是

\colorbox{green}
{%
    \drs{box label}
        {%
            drs box text%
        }%
}

(请注意,行首的空格忽略,以允许代码缩进。)编写此代码的更好方法可能是

\colorbox{green}{%
  \drs{box label}
      {drs box text}%
  }

这不能解决另一个小问题:\colorbox用一些填充包围框内容(这通常是所需的)。\fboxsep所有四个边距的填充都很宽。因此,可以这样做

{\setlength{\fboxsep}{0pt}\colorbox{green}{%
   \drs{box label}
      {drs box text}%
  }}

而额外的支架将确保的设置\fboxsep不会传播并被限制在组中。

可以利用 TeX 并为此定义一个命令:

\newcommand{\zcolorbox}[2]{{\setlength{\fboxsep}{0pt}\colorbox{#1}{#2}}}

并使用

\zcolorbox{green}{%
  \drs{box label}
      {drs box text}%
  }

最终得到了期望的结果。

在此处输入图片描述

对于彩色框嵌套的问题\drs,问题在于的实现drs,它考虑了嵌套级别,以便在内框上方和下方添加合适的填充:这是您正在尝试的黄色条纹的原因。

一个技巧是预先定义内部框:

\usepackage{drs}
\usepackage{xcolor,array}
\newcommand{\zcolorbox}[2]{{\setlength{\fboxsep}{0pt}\colorbox{#1}{#2}}}
\newcommand{\nestedbox}[3]{\zcolorbox{#1}{\drs{#2}{#3}}}

\newsavebox{\drsboxA}
\newcommand{\innerdrs}[3]{%
  \sbox{\drsboxA}{\zcolorbox{#1}{\drs{#2}{#3}}}%
  \ht\drsboxA=\dimexpr\ht\drsboxA+2pt\relax
  \dp\drsboxA=\dimexpr\dp\drsboxA+2pt\relax}

\begin{document}


\innerdrs{yellow}{inner box label}{inner box text}
\nestedbox{green}{box label}{\usebox\drsboxA}

\end{document}

在此处输入图片描述

相关内容