如何将 TikZ 图片叠加在宏生成的 TikZ 图片上?

如何将 TikZ 图片叠加在宏生成的 TikZ 图片上?

我是 LaTeX 的初学者,暂时将其用于工业文档。在尝试将一些简单的 Tikz 图形添加到一系列由一系列宏生成的一系列 Tikz 图片(非常复杂,每个图片都包含大量代码和大量参数)时,我遇到了很多麻烦。我想给它们添加带箭头的附加注释,并偶尔将组合的结果图形包含在带标题的图形中。在我看来,“记住图片,叠加”选项可以完成这项工作。下面是一个过于简化的示例。但是我无法理解第二张图片的坐标系与第一张图片的关系。我曾尝试将“记住图片,叠加”添加到生成第一张图片的宏中,但没有改进……有人可以解释并建议前进的方向吗?

\documentclass[dvipsnames]{article}
\usepackage{tikz}
\tikzstyle{wired}=[draw=gray!30, line width=0.15mm]
\tikzstyle{number}=[anchor=center, color=white]
\newcommand{\strip}[4]{
    \filldraw[#1, wired]
      ({18 *  #2}      :                   #3) arc
      ({18 *  #2}      : {18 * (#2 + 1)} : #3) --
      ({18 * (#2 + 1)} :                   #4) arc
      ({18 * (#2 + 1)} : {18 *  #2}      : #4) -- cycle;
}
\newcommand{\sector}[3]{
    \filldraw[#1, wired]
      (0, 0) --
      ({18 * #2} :                   #3) arc
      ({18 * #2} : {18 * (#2 + 1)} : #3) -- cycle;
}
\newcommand{\DrawShape}[0]{%
\centering
\begin{tikzpicture}[rotate=81, scale=.2, remember picture, overlay]
  \fill[gray!50] (0, 0) circle (225.5mm);
  \foreach\i in {1,3,...,19} {
    \sector{white}{\i}{162mm}
  }
 \end{tikzpicture}
}%
\begin{document}

\DrawShape

\begin{tikzpicture}[scale=8]
\begin{scope}[remember picture,overlay]
\coordinate (n1) at (0, 0);
\node[draw,font=\small,inner sep=5pt, anchor=west] (n1x) at (0.6,0) {\textbf{Optimum location}}; 
\draw[<-, >=latex,line width =5 pt, red] (n1) -- (n1x.west);
\draw[help lines,xstep=.1,ystep=.1] (0,0) grid (1,1);
\foreach \x in {0,1,...,9} { \node [anchor=north] at (\x/10,0) {0.\x}; }
\foreach \y in {0,1,...,9} { \node [draw] at (0,\y/10) {0.\y}; }
\end{scope}
\end{tikzpicture}

\vspace{10cm}
\DrawShape

\begin{figure}[ht]
\begin{tikzpicture}[scale=8]
\begin{scope}[remember picture,overlay]
\coordinate (n1) at (0, 0);
\node[draw,font=\small,inner sep=5pt, anchor=west] (n1x) at (0.6,0) {\textbf{Optimum location}}; 
\draw[<-, >=latex,line width =5 pt, red] (n1) -- (n1x.west);
\draw[help lines,xstep=.1,ystep=.1] (0,0) grid (1,1);
\foreach \x in {0,1,...,9} { \node [anchor=north] at (\x/10,0) {0.\x}; }
\foreach \y in {0,1,...,9} { \node [draw] at (0,\y/10) {0.\y}; }
\end{scope}
\end{tikzpicture}
\caption{An embarassing shift of the coordinate system and caption position \dots}
\end{figure}
\end{document}

答案1

您的代码不太容易理解,所以我从头开始编写。这是您想要的吗?

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}

\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,main,foreground}

\newcommand{\bullseye}[1]%
{   \begin{scope}[shift=(#1)]
        \begin{pgfonlayer}{background}
            \fill[even odd rule,gray!50] (0,0) circle (4)
            \foreach \x in {1,...,18}
            {   (0,0) -- (\x*20:3) -- (\x*20+10:3) -- (0,0)
            };
        \end{pgfonlayer}        
    \end{scope}
}

\begin{document}

\begin{tikzpicture}
\coordinate[remember picture] (myorigin) at (0,0);
\draw (0,0) grid ++(5,5);
\bullseye{myorigin}
\draw[ultra thick,red,<-] (myorigin) -- ++ (2,1) node[right] {Bullseye's center};
\end{tikzpicture}

This is a Test.
\begin{tikzpicture}
\coordinate[remember picture] (myorigin) at (1,2);
\bullseye{myorigin}
\draw (0,0) grid ++(5,5);
\draw[ultra thick,red,<-] (myorigin) -- ++ (2,1) node[right] {Bullseye's center};
\end{tikzpicture}

\end{document}

在此处输入图片描述


编辑1:当然,您可以在图形环境中使用它。诀窍是先指定靶心的位置,然后绘制圆圈。通常,您必须先绘制圆圈,然后再绘制其他所有东西,否则圆圈会覆盖您的图片。为了避免这种情况,您可以指定图层(在本例中为三个:背景、主图层和前景图层)。然后您可以在它们上面绘制图片,TikZ 会根据它们所在的图层为您堆叠它们。

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\usepackage{lipsum}

\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,main,foreground}

\newcommand{\bullseye}[1]%
{   \begin{scope}[shift=(#1)]
        \begin{pgfonlayer}{background}
            \fill[even odd rule,gray!50] (0,0) circle (4)
            \foreach \x in {1,...,18}
            {   (0,0) -- (\x*20:3) -- (\x*20+10:3) -- (0,0)
            };
        \end{pgfonlayer}        
    \end{scope}
}

\begin{document}

\lipsum[1]

\begin{figure}[hb]
    \begin{center}
        \begin{tikzpicture}[scale=0.5]
            \coordinate[remember picture] (myorigin) at (0,0);
            \draw (0,0) grid ++(5,5);
            \bullseye{myorigin}
            \draw[ultra thick,red,<-] (myorigin) -- ++ (2,1) node[right] {Bullseye's center};
        \end{tikzpicture}
    \end{center}
\caption{This is the first picture}
\end{figure}

\lipsum[2]

\begin{figure}[hb]
    \begin{center}
        \begin{tikzpicture}[scale=0.5]
            \coordinate[remember picture] (myorigin) at (1,2);
            \draw (0,0) grid ++(5,5);
            \bullseye{myorigin}
            \draw[ultra thick,red,<-] (myorigin) -- ++ (2,1) node[right] {Bullseye's center};
        \end{tikzpicture}
    \end{center}
\caption{This is the second picture}
\end{figure}

\lipsum[3]

\end{document}

在此处输入图片描述

答案2

另一种方法包括 3 个步骤:

  1. 通过使用standalone文档类或preview包,编译原始 (La)TeX 输入文件(包含现有的 Ti您可使用 .Z 宏(无需您的附加代码)来生成 PDF 图像。
  2. 为每个 PDF 图像创建一个新的 (La)TeX 输入文件,以便在图像上叠加注释(例如)。您可以使用 PSTricks 或 TiZ 来完成这项工作。在这个答案中,我将使用 PSTricks 来“简单化”。编译输入文件后,您将获得另一个包含笔记的 PDF 图像(例如)。
  3. 从主 (La)TeX 输入文件中,您可以使用 导入叠加的 PDF 图像。您还可以对其\includegraphics应用一些“附件”(例如\caption\centering、等)。\label

这种方法的优点:

  1. 你不需要了解现有的 Ti原始 (La)TeX 输入文件中的 Z 宏。
  2. 输入文件(原始文件或覆盖文件)变得更整洁、更清晰、更易读。
  3. 编译变得更快。

让我们一步一步地完成这些步骤。

步骤1

假设您的原始 (La)TeX 输入文件如下。

\documentclass{article}
\usepackage{tikz}

\tikzstyle{wired}=[draw=gray!30, line width=0.15mm]
\tikzstyle{number}=[anchor=center, color=white]

\newcommand{\sector}[3]{
    \filldraw[#1, wired]
      (0, 0) --
      ({18 * #2} :                   #3) arc
      ({18 * #2} : {18 * (#2 + 1)} : #3) -- cycle;
}

\begin{document}
\begin{tikzpicture}[rotate=81, scale=.2]
  \fill[gray!50] (0, 0) circle (225.5mm);
  \foreach\i in {1,3,...,19}{\sector{white}{\i}{162mm}}
\end{tikzpicture}
\end{document}

pdflatex如果您使用(或xelatex或)进行编译latex-dvips-ps2pdf,您将获得 PDF 图像,但其周围会有多余的空白。要删除多余的空白,请将 替换\documentclass{article}\documentclass[border=<length>]{standalone},其中length必须替换为0pt(例如) 或您喜欢的任何值。

以下是修改后的代码。

\documentclass[border=0pt]{standalone}
\usepackage{tikz}

\tikzstyle{wired}=[draw=gray!30, line width=0.15mm]
\tikzstyle{number}=[anchor=center, color=white]

\newcommand{\sector}[3]{
    \filldraw[#1, wired]
      (0, 0) --
      ({18 * #2} :                   #3) arc
      ({18 * #2} : {18 * (#2 + 1)} : #3) -- cycle;
}

\begin{document}
\begin{tikzpicture}[rotate=81, scale=.2]
  \fill[gray!50] (0, 0) circle (225.5mm);
  \foreach\i in {1,3,...,19}{\sector{white}{\i}{162mm}}
\end{tikzpicture}
\end{document}

再次重新编译,您将获得如下 PDF 输出:

在此处输入图片描述

我们将此 PDF 输出命名为tightOriginal.pdf

第2步

现在我们将在 上叠加一些注释tightOriginal.pdf。为了“简单起见”,我将使用 PSTricks 而不是 TiZ。

showgrid=top导航网格需要在开发过程中通过设置来打开。

在此处输入图片描述

稍后您可以通过设置将其关闭showgrid=false。您也可以设置border=0pt为获得紧密的 PDF 输出。

在此处输入图片描述

输入文件如下,请确保使用 进行编译xelatex

\documentclass[border=12pt]{standalone}

\def\Rows{5}
\def\Columns{5}
\def\Scale{0.9}
\def\Filename{tightOriginal}
\def\SetLabel#1{\color{blue}\bf\Large#1}


\usepackage{pstricks-add}

\usepackage{graphicx}
\newsavebox\IBox
\savebox\IBox{\includegraphics[width=\Scale\linewidth]{\Filename}}


\newpsstyle{gridstyle}
{
    subgriddots=15,
    subgridcolor=green,
    griddots=15,
    gridcolor=red,
}

\psset
{
    xunit=\dimexpr\wd\IBox/\Rows\relax,
    yunit=\dimexpr\ht\IBox/\Columns\relax,
    nodesepA=3pt,
    linecolor=red,
    linewidth=3pt,
}

\begin{document}

\begin{pspicture}[showgrid=false](\wd\IBox,\ht\IBox)
\rput[bl](0,0){\usebox\IBox}
% Axis
\psComment[ref=Cl,angleA=180]{->}(4,4.6)(0.5\wd\IBox,0.5\ht\IBox){\SetLabel{Axis}}[\ncdiagg]
% Spoke
\psComment[ref=Cr]{->}(1,4.6)(2,3.2){\SetLabel{Spoke}}[\ncdiagg]
\end{pspicture}
\end{document}

我们将 PDF 输出命名为overlaid.pdf

步骤3

overlaid.pdf最后一步是从我们的主要输入文件导入。

\documentclass{article}
\usepackage{graphicx}
\usepackage{lipsum}
\begin{document}
\lipsum[1-2]
\begin{figure}[hbtp]
\centering
\includegraphics[width=0.5\linewidth]{overlaid}
\caption{My wheel of fortune.}
\label{fig:wheel}
\end{figure}
\lipsum[3]
\end{document}

用它编译pdflatex,我们将得到如下输出:

在此处输入图片描述

相关内容