![Tikz:定位库破坏路径图片边界框?](https://linux22.com/image/291651/Tikz%EF%BC%9A%E5%AE%9A%E4%BD%8D%E5%BA%93%E7%A0%B4%E5%9D%8F%E8%B7%AF%E5%BE%84%E5%9B%BE%E7%89%87%E8%BE%B9%E7%95%8C%E6%A1%86%EF%BC%9F.png)
我尝试使用 tikz-nodes 创建和排序文本框。到目前为止,节点是使用 tikzpositioning
库排序的。此外,我尝试使用 在节点背景上显示数字path picture
。
这是一个简单的例子:
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\usepackage[outline]{contour}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{environ}
\newlength{\myblockwidth}
\newcounter{boxcounter}
\newlength{\mylinewidths}
\newlength{\myinnersep}
\setlength{\mylinewidths}{5pt}
\setlength{\myinnersep}{2ex}
\NewEnviron{mycolorblock}[2][]{%
\addtocounter{boxcounter}{1}%
\setlength{\myblockwidth}{#2}%
\addtolength{\myblockwidth}{-4ex}%
\contourlength{.333pt}%
\node[
#1,
draw=orange,
fill=orange!10,
line width=\mylinewidths,
inner sep=2ex,
rounded corners = 2.5ex,
path picture={%
\node[white,
circle, draw=blue!20, line width=\mylinewidths, inner sep=.1pt,
scale = 15,
font=\bf] at (path picture bounding box.center)
{\contour{blue!20}{\the\value{boxcounter}}};}
](box\the\value{boxcounter}){
\begin{minipage}[t][]{\myblockwidth}%
\BODY
\end{minipage}%
};
}
\begin{document}
\begin{tikzpicture}[inner sep=0pt,node distance=5pt]
\begin{mycolorblock}{\textwidth}
\blindtext[2]
\end{mycolorblock}
\begin{mycolorblock}[below = of box1]{\textwidth}
\blindtext[2]
\end{mycolorblock}
\end{tikzpicture}
\end{document}
使用pdflatex
第二个块的背景编号进行处理(任何额外的块都是偏离中心的:
因此,背景总是从第一个块的中心移开,并且与该块中心的距离似乎按比例缩放scale
。
我甚至不确定是哪个positioning
库导致了此行为。如果有人能指出如何修复或迁移此问题,我将不胜感激。
答案1
该positioning
选项below=...
将框的锚点(外部节点)更改为north
。该path picture
节点是内部节点,因此它继承了此锚点。
添加anchor=center
到节点里面的选项可以path picture
解决问题:
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\usepackage[outline]{contour}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{environ}
\newlength{\myblockwidth}
\newcounter{boxcounter}
\newlength{\mylinewidths}
\newlength{\myinnersep}
\setlength{\mylinewidths}{5pt}
\setlength{\myinnersep}{2ex}
\NewEnviron{mycolorblock}[2][]{%
\addtocounter{boxcounter}{1}%
\setlength{\myblockwidth}{#2}%
\addtolength{\myblockwidth}{-4ex}%
\contourlength{.333pt}%
\node[
#1,
draw=orange,
fill=orange!10,
line width=\mylinewidths,
inner sep=2ex,
rounded corners = 2.5ex,
path picture={%
\node[white,
circle, draw=blue!20, line width=\mylinewidths, inner sep=.1pt,
scale = 15,
font=\bf,
anchor=center % set the anchor of the node inside the path picture
] at (path picture bounding box.center)
{\contour{blue!20}{\the\value{boxcounter}}};}
](box\the\value{boxcounter}){
\begin{minipage}{\myblockwidth}%
\BODY
\end{minipage}%
};
}
\begin{document}
\begin{tikzpicture}[inner sep=0pt,node distance=5pt]
\begin{mycolorblock}{\textwidth}
\blindtext[2]
\end{mycolorblock}
\begin{mycolorblock}[below = of box1]{\textwidth}
\blindtext[2]
\end{mycolorblock}
\end{tikzpicture}
\end{document}
答案2
这不是你的问题的答案,而是另一种生产这种编号盒子的方法tcolorbox
。
tcolorbox
包括watermark
将水印添加到方框背景的选项。您可以拥有text
、image
和tikz
水印。
另一个可以稍微简化您工作的选项是它的自动计数器处理。您可以\newcounter
在序言中创建一个,然后选项[use counter=yournewcounter]
会自动增加计数器,每次添加新的tcolorbox
。此外,您无需记住使用的是哪个计数器,因为tcolorbox
声明中的计数器值就是\thetcbcounter
。
接下来是定义与您的框类似的框的代码示例。
\documentclass{article}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage[most]{tcolorbox}
\usepackage[outline]{contour}
\newlength{\myblockwidth}
\newlength{\mylinewidths}
\newlength{\myinnersep}
\setlength{\mylinewidths}{5pt}
\setlength{\myinnersep}{2ex}
\contourlength{.333pt}
\newcounter{boxcounter}
\newtcolorbox[use counter=boxcounter]{mycolorblock}[2][]{%
enhanced,
notitle,
colframe=orange,
colback=orange!10,
watermark tikz={\node[circle, text=white, draw=blue!20,%
line width=\mylinewidths, inner sep=.1pt, scale=15,
font=\bfseries] {\contour{blue!20}{\textcolor{white}{\thetcbcounter}}};},%
watermark color=white,
width=#2,
boxrule=\mylinewidths,
}
\begin{document}
\begin{mycolorblock}{\textwidth}
\thetcbcounter \blindtext[2]
\end{mycolorblock}
\par
\begin{mycolorblock}{\textwidth}
\thetcbcounter \blindtext[2]
\end{mycolorblock}
\end{document}
更新
tcolorbox
包括remember as
为框指定名称的选项。此名称可在外部用作参考tikzpictures
。因此可以在多个之间绘制连接箭头tcolorboxes
。下面的代码显示了一个示例。
现在,boxes 有三个参数。第一个是可选的,将作为额外tcolorbox
选项传递给mycolorblock
。第二个(强制)是水印编号,第三个(也是强制)是框宽度。
\documentclass[a4paper]{article}
\usepackage[margin={1cm,2cm,1cm,1cm}]{geometry}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage[most]{tcolorbox}
\usepackage[outline]{contour}
\usepackage{multirow}
\thispagestyle{empty}
\newlength{\myblockwidth}
\newlength{\mylinewidths}
\newlength{\myinnersep}
\setlength{\mylinewidths}{5pt}
\setlength{\myinnersep}{2ex}
\contourlength{.333pt}
\newcounter{boxcounter}
\newtcolorbox{mycolorblock}[3][]{%
enhanced,
nobeforeafter,
notitle,
colframe=orange,
colback=orange!10,
watermark tikz={\node[circle, text=white, draw=blue!20,%
line width=\mylinewidths, inner sep=.1pt, scale=15,
font=\bfseries] {\contour{blue!20}{\textcolor{white}{#2}}};},%
watermark color=white,
width=#3,
boxrule=\mylinewidths,
remember as ={#2}
}
\begin{document}
\begin{tabular}{cc}
\begin{mycolorblock}{1}{.45\textwidth}
\blindtext[1]
\end{mycolorblock} &
\begin{mycolorblock}{2}{.45\textwidth}
\blindtext[1]
\end{mycolorblock} \\
\begin{mycolorblock}{3}{.45\textwidth}
\blindtext[1]
\end{mycolorblock}
\end{tabular}
\begin{tikzpicture}[overlay, remember picture, line width=\mylinewidths, draw=orange]
\draw[->] (1.north) --++(90:.75cm) -| (2);
\draw[->] (1.west) --++(180:.75cm) |- (3);
\draw[->] (3) -| (2);
\end{tikzpicture}
\end{document}