从外向内的嵌套盒

从外向内的嵌套盒

数组编程语言有装箱的概念。J 就是这样一种语言。装箱可以包含任何东西,也可以不包含任何东西。最重要的是,由于数组语言的设计,装箱是从外向内的,并且也是以这种方式直观呈现的,正如在 提供的环境中所见fancyvbr,其中放置了 jconsole 从 的输入得到的结果<(<1),<<2

对于非嵌套示例,例如空列表和 1,\fbox{}就足够了。

然而,对于(一个带有 1 的盒子)和(一个带有(一个带有 2 的盒子)的盒子)的盒子,这两个盒子在第 1 级的框架并不对齐,因为它们是从内向外构建的,也就是说,它们是增大而不是缩小的。

我在 TeX SE 中寻找类似的难题,在 CTAN 中寻找装箱和嵌套包,但没有找到相关的东西。如果不是因为没有明确的 ,使用\hlines 和 nested就可以了。我可能错过了一些非常简单的东西,但我预计会有大量的 TiKZ 代码,并不简单。\tabular\vspace{...}

这是我的练习表,即 MWE:

\documentclass{article}
\usepackage{microtype,calc}
\usepackage{fancyvrb}
\setlength{\fboxsep}{1pt}
\setlength{\fboxrule}{0.20pt}
\setlength{\dashlength}{3pt}
\setlength{\hangindent}{0pt}
\setlength{\parindent}{0pt}
\AtBeginDocument{
  \newlength{\myht}   \settoheight{\myht}{0}
  \newlength{\mydp}   \settodepth{\mydp}{0}
  \newlength{\mylen}  \setlength{\mylen}{\dimexpr\baselineskip-\myht-\mydp-1.1pt\relax}
  \def\ebox{\fbox{\hbox to 0.25ex{\vbox to \mylen{}}}}
}
\usepackage[raster]{tcolorbox}
\begin{document}

\fbox{\ebox\fbox{\fbox{1}}}

\fbox{\fbox{1}\fbox{\fbox{2}}}

\fbox{ \begin{tabular}{|c|c|}\hline 1 & \fbox{ \hbox to 0.2ex {\vbox to 5ex{}}2 }\\ \hline\end{tabular} }
\begin{Verbatim}
┌───────┐
│┌─┬───┐│
││1│┌─┐││
││ ││2│││
││ │└─┘││
│└─┴───┘│
└───────┘
\end{Verbatim}

{
\setlength{\fboxsep}{1ex}
\begin{tabular}{|c|c|}\hline
1 & \fbox{2} \\
\hline\end{tabular}
}

\fbox{\fbox{\ebox}\fbox{1 2}}\\
\fbox{%
\begin{minipage}{2cm}\begin{tcbitemize}[size=fbox,sharp corners,colframe=black,colback=white,raster equal height,raster force size=false,raster equal skip=0pt,raster column skip=2mm]%
\tcbitem 1 2 3%
\tcbitem 1 2%
\end{tcbitemize}\end{minipage}%
}
\end{document}

编译后为 在此处输入图片描述

编辑:我想重现 Verbatim 示例。框的内容是否垂直居中并不重要,只要同一级别的框具有相同基线的框架,即它们的深度和高度相同即可。

答案1

也许是这个??

\documentclass{article}
\usepackage{listofitems}
\newlength\maxht
\newlength\maxdp
\newcommand\cbox[1]{%
  \readlist*\mylist{#1}%
  \maxht=0pt
  \maxdp=0pt
  \foreachitem\z\in\mylist[]{%
    \setbox0=\hbox{\z}%
    \ifdim\ht0>\maxht\relax\maxht=\ht0\fi
    \ifdim\dp0>\maxdp\relax\maxdp=\dp0\fi
  }
  \foreachitem\z\in\mylist[]{%
    \fbox{\z\rule[-\maxdp]{0pt}{\dimexpr\maxdp+\maxht}}%
    \kern-\fboxrule
  } 
}
\parskip1em
\begin{document}

\cbox{1,2}

\cbox{1,\cbox{2}}

\cbox{\cbox{1,\cbox{2}}}

\cbox{\cbox{\cbox{\cbox{1,2},3,4}, 5}}

\end{document}

在此处输入图片描述

答案2

这显示了如何匹配保存框的高度、宽度或两者。

\documentclass{article}
\parskip=1ex

\newcommand{\matchbox}[2]% #1 = box register, #2 = contents
  {\makebox[\wd#1]{\raisebox{0pt}[\ht#1][\dp#1]{#2}}}
  
\begin{document}
\sbox0{\fbox{A}}%
\fbox{\usebox0}\fbox{\raisebox{0pt}[\ht0][\dp0]{B}}

\fbox{\usebox0}\fbox{\makebox[\wd0]{B}}

\fbox{\usebox0}\fbox{\matchbox{0}{B}}

\sbox1{\fbox{\usebox0}\fbox{\matchbox{0}{B}}}%
\sbox2{\fbox{\usebox1}\fbox{\matchbox{1}{C}}}%
\fbox{\usebox2}\fbox{\matchbox{2}{D}}

\end{document}

演示

答案3

这不是一个很好的答案,但通过调整框架宽度和分离长度,隐形盒子就可以出售:

\documentclass{article}
\setlength{\fboxrule}{0.2pt}
\setlength{\fboxsep}{1.0pt}
\newcommand{\FBOX}[1]{{\fbox{\setlength{\fboxsep}{\dimexpr\fboxsep+\fboxrule\relax}\setlength{\fboxrule}{0pt}\fbox{#1}}}}
\newcommand{\nbox}[1]{{\fbox{\setlength{\fboxsep}{\dimexpr\fboxsep+\fboxrule\relax}\setlength{\fboxrule}{0pt}#1}}}
\begin{document}
\fbox{\fbox{1}\fbox{\fbox{2}}}

\nbox{\fbox{1}}\fbox{\fbox{2}}

\FBOX{1}\fbox{\fbox{2}}
\end{document}

编辑:增加fboxsep即将消失的部分fboxrule有助于缓解差异,但相邻框之间仍然存在可见的距离,这个距离非常小,比如 1 个像素。

相关内容