Tcolorbox 海报:如何在不改变其他列的一侧的情况下添加列或覆盖范围

Tcolorbox 海报:如何在不改变其他列的一侧的情况下添加列或覆盖范围

我正在使用 tcolorbox/tcbposter 来绘制一些图形,因为使用这个网格实际上非常实用(我通常首先以独立模式编写图像,然后使用激活的包将其包含在一些文档中\input{}standalone

但是,我找不到一种简单的方法来添加更多列而不改变其他列的大小(例如,我看不到设置列宽的选项)。例如,假设我画了这张图:

在此处输入图片描述

现在,我想在右侧添加一列。如果我只是增加列数并添加我的节点,结果并不好,因为它会改变其他列的长度: 在此处输入图片描述

类似地,如果我保留 3 列但更改覆盖right=2cm选项以增加边界框(为了使箭头出现,我没有更好的方法),那么我也会更改列的大小:

在此处输入图片描述

你知道怎样才能固定列的宽度,以便能够在不改变绘图的情况下扩大列数的覆盖范围吗?

谢谢!

梅威瑟:

\documentclass{standalone}
\usepackage[many,poster]{tcolorbox}
\usepackage{tikz}
\usetikzlibrary{fit,backgrounds}
\begin{document}
\begin{tcbposter}[
  poster = {
    height=5cm,
    spacing=10mm,
    % Can't add a new column without breaking the "Here I am :)"
    % on two lines.
    %% Good result but on 3 columns:
    % columns=3,
    % Breals the length of the other columns:
    columns=4,
    rows=3,
  },
  coverage={
    % Can't set this number to 2 without breaking the "Here I am :)"
    % on two lines. So 'X' is invisible.
    left=2cm, 
    % right=0cm
  }
  ]
  \posterbox{name=A,column=2,row=1,rowspan=2}{Here I am :)}
  \posterbox{name=C,column=3,row=2}{$C$}
  \posterbox{name=D,column=1,row=3}{$D$}
  % I would like now to add a node.
  \posterbox{name=E,column=4,row=1}{$E$}
  \draw [->] (TCBPOSTER@C) -- ([email protected] |- TCBPOSTER@C);
  \draw [->] (TCBPOSTER@A) -- (TCBPOSTER@D);
  % And draw outside without changing the size
  \draw [->] ([email protected]) -- ++(-1.5cm,0mm) node[above] {X};
\end{tcbposter}%
\end{document}

答案1

tcolorbox用作\linewidth所有框(包括 tcpboster)的默认宽度。您可以使用命令width中的选项更改此宽度posterset

但是这个宽度用于固定 tcbposters 中的列宽。当您将列数从 3 更改为 4 时,列会变窄,因为必须将更多列放入框中。

如果您想在增加列时保持一定的列宽,则必须更改 tcbposter 宽度。

以下代码显示了一个示例。第一个示例假设 4 列宽度为 3cm,列间距为 10mm,左边距为 2cm。总宽度在coverage选项中固定。第二个示例,我添加了一个新列,这意味着宽度增加了 4cm。这样,列的大小保持不变。

我确信您能够找到一种自动化的方法来做到这一点。

\documentclass{standalone}
\usepackage[most]{tcolorbox}
\usepackage{tikz}
\usetikzlibrary{fit,backgrounds}
\standaloneenv{tcbposter}
\begin{document}
\begin{tcbposter}[
  poster = {
    height=5cm,
    spacing=10mm,
    columns=4,
    rows=3,
  },
  coverage={
     %width=columns*columnwidth+(columns-1)*spacing+coverage-margins
     width=17cm,
    left=2cm, 
    right=0cm
  }
  ]
  \posterbox{name=A,column=2,row=1,rowspan=2}{Here I am :)}
  \posterbox{name=C,column=3,row=2}{$C$}
  \posterbox{name=D,column=1,row=3}{$D$}
  % I would like now to add a node.
  \posterbox{name=E,column=4,row=1}{$E$}
  \draw [->] (TCBPOSTER@C) -- ([email protected] |- TCBPOSTER@C);
  \draw [->] (TCBPOSTER@A) -- (TCBPOSTER@D);
  % And draw outside without changing the size
  \draw [->] ([email protected]) -- ++(-1.5cm,0mm) node[above] {X};
\end{tcbposter}%

\begin{tcbposter}[
  poster = {
    height=5cm,
    spacing=10mm,
    columns=5,
    rows=3,
  },
  coverage={
     %width=columns*columnwidth+(columns-1)*spacing+coverage-margins
     width=21cm, 
    left=2cm, 
    right=0cm
  }
  ]
  \posterbox{name=A,column=2,row=1,rowspan=2}{Here I am :)}
  \posterbox{name=C,column=3,row=2}{$C$}
  \posterbox{name=D,column=1,row=3}{$D$}
  % I would like now to add a node.
  \posterbox{name=E,column=4,row=1}{$E$}
  \posterbox{name=E,column=5,row=2}{$F$}
  \draw [->] (TCBPOSTER@C) -- ([email protected] |- TCBPOSTER@C);
  \draw [->] (TCBPOSTER@A) -- (TCBPOSTER@D);
  % And draw outside without changing the size
  \draw [->] ([email protected]) -- ++(-1.5cm,0mm) node[above] {X};
\end{tcbposter}%
\end{document}

在此处输入图片描述

似乎您想使用 ,tcposter因为它定义了用于分配盒子的网格。但是可以使用 获得类似的东西TikZ matrix。以下代码显示了一个示例。matrix定义了一个常规结构(如 tcbposter),您可以在此结构上放置节点。其中一些可以作为matrix组件绘制,而另一些可以使用矩阵提供的网格绘制。

\documentclass[tikz, border=2mm]{standalone}

\usetikzlibrary{fit, matrix}

\begin{document}
\begin{tikzpicture}[
    mynodes/.style={rounded corners, minimum width=3cm, minimum height=1cm, anchor=center},
    phantom/.style={mynodes, draw=gray!30, fill=none},
    drawn/.style={phantom, draw=black, fill=gray!30},
    mygrid/.style={
        matrix of nodes, nodes in empty cells,
        nodes={phantom},
        column sep=7mm, row sep=7mm},
    myfit/.style={drawn, inner sep=0pt, fit=#1}
    ]

    \matrix (a) [mygrid]
    {&&&|[drawn]|E\\ 
    &&|[drawn]|C& \\ 
    |[drawn]|D&&&\\};
    \node[myfit={(a-1-2) (a-2-2)}] (b) {Here I am :)};
    \draw[->] (a-2-3)--(a-2-3-|a-2-2.east);
    \draw[->] (b)--(a-3-1);
    \draw[->] (a-3-1.west)--++(180:2cm);
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容