![使用 TikZ 嵌套标记彩色框](https://linux22.com/image/246005/%E4%BD%BF%E7%94%A8%20TikZ%20%E5%B5%8C%E5%A5%97%E6%A0%87%E8%AE%B0%E5%BD%A9%E8%89%B2%E6%A1%86.png)
我需要嵌套框,因为它们显示在这个问题,而是彩色的。
我尝试了两种解决方案。使用shapes.multipart
命令生成节点部分时,我完全失败了foreach
。如果我\tikz
在一个节点部分中使用多个部分,我可以使用foreach
,但我无法将它们放在一列中(尝试矩阵,失败了)。
试drs
我xcolor
几乎得到了正确的结果,但是当我写下这个时:
\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}
并得到这个:
我怎样才能去除那里的黄色,但不去除空间?
答案1
我开一个小讨论。
这里提供一种使用 LaTeX3 并结合内核 LaTeX2e 中定义的一些功能的方法。
您的颜色框的输入如下:
\nestedbox[<options>]{<header>}{<inner box>}
其中inner box
是一个逗号分隔的列表。
可用选项包括:
outer-color
设置整个框的背景颜色inner-color
设置内框的背景bgcolor
集合inner-color
和outer-color
line-color
设置框架的颜色margin
为最宽的单词添加额外的空格alignment
选择框的对齐方式。可用的有left
和right
center
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}