Tikz:定位库破坏路径图片边界框?

Tikz:定位库破坏路径图片边界框?

我尝试使用 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将水印添加到方框背景的选项。您可以拥有textimagetikz水印。

另一个可以稍微简化您工作的选项是它的自动计数器处理。您可以\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}

在此处输入图片描述

相关内容