我正在使用 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}