我知道如何使用 \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 的epslatex
、cairolatex
或pdf
终端都不能胜任这项任务。因为所有这些终端都会从 gnuplot 文件创建自包含的“图像”。这种方法不利于生成排版良好的文档。
相比之下,gnuplotlatex
和tikz
终端不会创建自包含图像,而是创建 latex 代码,latex 会从中编译最终图形。最终输出的印刷质量要高得多。
下面的示例展示了如何将使用 gnuplottikz
终端创建的图形集成到您的文档中以及如何注释该图形。
它用于siunitx
排版数字,gnuplot-lua-tikz
由提供gnuplot
并gnuplottex
支持使用 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}