tikz:如何注释用 gnuplot 的 epslatex 终端创建的图片?

tikz:如何注释用 gnuplot 的 epslatex 终端创建的图片?

我知道如何使用 \node 和 includegraphics 注释图片,看这里。但我需要包含一张用 gnuplot 和 epslatex 终端创建的图片。生成的 *.tex 看起来像这样(缩短):

% GNUPLOT: LaTeX picture with Postscript
\begingroup
  \makeatletter
  \providecommand\color[2][]{%
    \GenericError{(gnuplot) \space\space\space\@spaces}{%
      Package color not loaded in conjunction with
      terminal option `colourtext'%
    }{See the gnuplot documentation for explanation.%
    }{Either use 'blacktext' in gnuplot or load the package
      color.sty in LaTeX.}%
    \renewcommand\color[2][]{}%
  }%
  \providecommand\includegraphics[2][]{%
    \GenericError{(gnuplot) \space\space\space\@spaces}{%
      Package graphicx or graphics not loaded%
    }{See the gnuplot documentation for explanation.%
    }{The gnuplot epslatex terminal needs graphicx.sty or graphics.sty.}%
    \renewcommand\includegraphics[2][]{}%
  }%
  \providecommand\rotatebox[2]{#2}%
  \@ifundefined{ifGPcolor}{%
    \newif\ifGPcolor
    \GPcolortrue
  }{}%
  \@ifundefined{ifGPblacktext}{%
    \newif\ifGPblacktext
    \GPblacktexttrue
  }{}%
  % define a \g@addto@macro without @ in the name:
  \let\gplgaddtomacro\g@addto@macro
  % define empty templates for all commands taking text:
  \gdef\gplbacktext{}%
  \gdef\gplfronttext{}%
  \makeatother
  \ifGPblacktext
....
\begin{picture}(7200.00,5040.00)%
    \gplgaddtomacro\gplbacktext{%
      \csname LTb\endcsname%%
      \put(2034,4534){\makebox(0,0){\strut{}(a)}}%
      \put(983,3955){\makebox(0,0)[l]{\strut{}(a)}}%
    }%
    \gplgaddtomacro\gplfronttext{%
      \csname LTb\endcsname%%
...
    \gplbacktext
    \put(0,0){\includegraphics{mypath/mypic.eps}}%
    \gplfronttext
  \end{picture}%
\endgroup

这需要通过“输入”来包含。那么我如何在 tikzpicture 环境中嵌入这种图片并对其进行注释?

答案1

序幕

我猜你不会在这里找到很多经常使用 gnuplot 和 latex 的用户。

如果您想要创建能够很好地融入文档的图表,那么您可以找到其他替代方案,这些方案遵循更符合 tex'ish 的方式,并且拥有更大的用户群,例如pgfplots

然而,使用 gnuplot 和 latex 创建高质量图表并非不可能。

不过,我认为gnuplot 的epslatexcairolatexpdf终端都不能胜任这项任务。因为所有这些终端都会从 gnuplot 文件创建自包含的“图像”。这种方法不利于生成排版良好的文档。

相比之下,gnuplotlatextikz终端不会创建自包含图像,而是创建 latex 代码,latex 会从中编译最终图形。最终输出的印刷质量要高得多。

下面的示例展示了如何将使用 gnuplottikz终端创建的图形集成到您的文档中以及如何注释该图形。

它用于siunitx排版数字,gnuplot-lua-tikz由提供gnuplotgnuplottex支持使用 gnuplot 从单个 tex 文件创建图形。

注释 Gnuplot 输出的简单方法(tikz-Terminal)

注释在环境内进行tikzpicture。图中的所有节点均在gnuplot环境之后进行注释。

我不知道你到底想要实现什么,但仅仅注释图表,这种方法应该可以做到。

我希望该代码对您来说尽可能的不言自明。

但为了激励目的,首先编译输出。如您所见,整个页面上的字体是一致的。

在此处输入图片描述

\documentclass[10pt]{article}

\usepackage{tikz}
\usepackage{siunitx}
\usepackage[siunitx]{gnuplottex}
\usepackage{gnuplot-lua-tikz}
\usepackage{lipsum}

\tikzset{
    tick style/.style = {
        black, inner sep=1ex, rounded corners=0.4ex, font=\small, 
    },
    gp node right/.append style = {
        tick style, fill=red!20, font=\footnotesize
    },
    gp node center/.append style = {
        tick style, fill=green!20, yshift=-3ex
    }
}

\begin{document}

\lipsum
\begin{figure}
    \centering
    \begin{tikzpicture}
        \begin{gnuplot}[
            terminal=tikz, 
            terminaloptions={
                color size 10,8 nopicenvironment originreset tightboundingbox createstyle
            }
        ]
            set yrange [-2:2]
            set ytics 1.0
            set samples 500
            set key spacing 2.5
            set zeroaxis
            set grid xtics
            set grid ytics
            plot [-10:10] 10**-2*sin(4*x)*x**2 lw 4 t '$10^{-2}x^2\sin{4x}$',\
            3/(1+exp(-x))-1.5 ls 2  lt 3 t '$\displaystyle \frac{3}{1+\exp{-x}}-1.5$'

        \end{gnuplot}

        % Create all labels
        \foreach \i/\j in {%
            {west}/{left}, {north west}/{above left},
            {north}/{above}, {north east}/{above right},
            {east}/{right}, {south east}/{below right},
            {south}/{below}, {south west}/{below left},
            {center}/{above}%
        } {
            \fill[red] (gp plot 1.\i) circle[radius=1mm] node[\j, text=black, fill=white, fill opacity=0.6, text opacity=1, inner sep=2ex]{\i};
        }

    \end{tikzpicture}

    \caption{Gnuplot tikz terminal in action}
\end{figure}

\end{document}

注释 Gnuplot 输出的智能方法(tikz-Terminal)

不幸的是我今天没有太多时间。但我想指出的是,可以在 gnuplot 的坐标系中定义参考节点,稍后可以从您的 latex 文档中引用这些节点。

官方参考手册中对该功能的描述很差。它说:

该字符串可能包含任何有效的 TeX/LaTeX/ConTeXt 字体命令,例如 '\small'。它以“font={}”的形式直接作为节点参数传递。这可能会被“滥用”以向节点添加更多代码,例如 '\small,yshift=1ex' 或 ',yshift=1ex' 也是有效的,而后者不会更改当前字体设置。

关键信息如下gnuplot-lua-tikz-common.tex

要向图中添加一个可引用名称为“my node”的空标签,只需将以下行添加到 gnuplot 文件中:

set label "" at 1,1 font ",gp refnode,name=my node"

在此处输入图片描述

\documentclass[10pt]{article}

\usepackage[hmargin=3.5cm]{geometry}

\usepackage{tikz}
\usepackage{siunitx}
\usepackage[siunitx]{gnuplottex}
\usepackage{gnuplot-lua-tikz}
\usepackage{lipsum}
\usepackage{xsavebox}

\usetikzlibrary{ducks}

\xsavebox{duck}{%
    \tikz{\draw (0,0) pic[duck/body=black!20!magenta] {duck};}%
}

\begin{document}

\lipsum
\begin{figure}
    \centering
    \begin{tikzpicture}[
        aux line style/.style = {
            ->, thick, shorten >=4pt, >=stealth, 
        },
        circled number style/.style = {
           circle, thick, fill=orange!20, draw=black
        }
    ]
        \begin{gnuplot}[
            terminal=tikz, 
            terminaloptions={
                color size 14,11 nopicenvironment originreset tightboundingbox createstyle
            }
        ]
            set yrange [-2:2]
            set ytics 1.0
            set samples 750
            set zeroaxis
            set grid xtics
            set grid ytics

            f1(x) = 10**-2*sin(2*pi*x/(2))*x**2

            set label "" at 2,1.6 font ",gp refnode, name=annotate"
            set label "" at -9.5,f1(-9.5) font ",gp refnode, name=p1"

            set label "" at 0,-1.5 font ",gp refnode, name=p2"

            set for [j=0:8] label "" at 2*j-8.5,f1(2*j-8.5) font sprintf(",gp refnode, name=n%d", j)
            set for [j=0:8] label "" at 2*j-7.5,f1(2*j-7.5) font sprintf(",gp refnode, name=d%d", j)

            plot [-10:10]   f1(x) lw 4 t ''

        \end{gnuplot}

        \draw (annotate) node[circled number style]{1} edge[aux line style, out=-180, in=90] (p1);

        \begin{scope}[overlay]
            \node[circled number style] (2) at ([shift={(6,-5)}]gp plot 1.south) {2};
            \foreach \i in {0,1,...,8}{
                \draw[aux line style, green!40!black]  (2) edge[in=-90, out=90] (n\i);
                \fill[red, draw=black] (n\i) circle[radius=1mm];
            }
        \end{scope}

        \foreach \i in {0,1,...,8}{
            \node[
                scale=0.4,
                anchor=south, 
                inner sep=-2pt, 
                rotate={30*mod(\i,3)-30}
            ] at (d\i) {\xusebox{duck}}; 
        }

    \end{tikzpicture}\medskip

    \caption{Gnuplot tikz terminal in action}
\end{figure}

\end{document}

相关内容