假设我们有以下链接中给出的蘑菇的 JPEG 文件: 维基百科蘑菇
为了更容易地在 JPEG 中找到所需的点,让我们按照以下链接中 Jake 的回答在图像顶部绘制一个标记网格: JPEG 顶部的 Jake 标签网格 按照 Jake 的回答,我们定义了一个坐标系,其 (0,0) 位于 JPEG 的西南方向,(1,1) 位于 JPEG 的东北方向。假设我们想要在 JPEG 的缩放 (0.5, 0.5) 处添加一个圆角矩形节点,其内部 xsep= 0.2 单位,内部 ysep= 0.2 缩放单位。以下是我的代码:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary {shapes.misc}
\usepackage{anyfontsize}
\newcommand{\midfont}{\usefont{T1}{cmr}{b}{n}\fontsize{15}{\baselineskip} \selectfont}
\begin{document}
\begin{tikzpicture}
\node[anchor=south west,inner sep=0] (image) at (0,0) {\includegraphics[width=0.9\textwidth]
{mushrooms.jpg}};
\begin{scope}[x={(image.south east)},y={(image.north 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 [anchor=east] at (0,\y/10) {0.\y}; }
\node at ( {.5+0},.5) [ red, line width=2 pt, shape=rounded rectangle,draw, inner xsep=30,
inner ysep=20] (rect){};
\node at ( {.5-.2},{.5+.2}) (text){\textcolor{red}{\midfont{Center is Here}}};
\draw [line width=3 pt, red][->] (rect) -- (text);
\end{scope}
\end{tikzpicture}
\end{document}
我有以下两个问题:
答案1
x={(image.south east)}, y={(image.north west)}
在可选参数中scope
定义给定的/tikz/x
和/tikz/y
单位向量scope
,以便在低级 PGF 绘图系统中:
这X坐标
/tikz/x
是图像的宽度(以点为单位),其是坐标为0pt
;这X的坐标
/tikz/y
是0pt
及其是坐标是图像的高度(以点为单位)。
这是有效的,因为前面的代码:
\node[anchor=south west, inner sep=0] (image) at (0,0)
{\includegraphics[width=0.9\textwidth]{mushrooms.jpg}};
定义image
为图像周围的紧密矩形节点,其south west
角位于原点(0,0)
。
关于你想要实现的目标,大多数 Ti钾期望长度的 Z 选项将无单位输入解释为长度点,这就是为什么你必须反复试验,并给和赋予“大”值inner xsep
。inner ysep
我宁愿使用minimum width
和minimum height
选项来确定节点所需的宽度和高度rect
。你仍然需要给它们明确的单位,或者提供长度点我将使用简单的\getxlength
和宏来轻松存储和的\getylength
当前长度/tikz/x
/tikz/y
,以点表示(其他技术可以在以下答案中找到这个问题)。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc, shapes.misc}
\newcommand{\midfont}{\fontsize{15}{18}\usefont{T1}{lmss}{m}{n}}
\makeatletter
% These assume that the /tikz/x vector is “horizontal” and /tikz/y “vertical”.
\newcommand*{\getxlength}[1]{\edef#1{\the\pgf@xx}}
\newcommand*{\getylength}[1]{\edef#1{\the\pgf@yy}}
\makeatother
\begin{document}
\centering
\begin{tikzpicture}
\node[anchor=south west, inner sep=0] (image) at (0,0)
{\includegraphics[width=0.9\textwidth]{mushrooms.jpg}};
\begin{scope}[x={(image.south east)}, y={(image.north 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 [anchor=east] at (0, \y/10) {0.\y}; }
% Get the unit vector lengths in points
\getxlength{\xLen} \getylength{\yLen}
\node[draw, red, line width=1pt, shape=rounded rectangle, inner sep=0,
minimum width=0.2*\xLen, minimum height=0.2*\yLen]
at (.5,.5) (rect) {};
\node[red, font=\midfont] at (0.5-0.2, 0.5+0.2) (text) {Center is here};
\draw[line width=1pt, red, ->] (text) -- (rect);
\end{scope}
\end{tikzpicture}
\end{document}
答案2
[x={(image.south east)},y={(image.north west)}]
定义了x 向量和y 向量在范围坐标系中。inner sep
参数(如inner xsep
和inner ysep
)是绝对长度。其默认单位是pt
。因此inner xsep=30
相当于inner xsep=30pt
。要定义符合您要求的节点,您可以使用
calc
和fit
库。注意:形状的圆形部分
rounded rectangle
不能包含文本(查看红色和橙色节点之间的差异)。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary {shapes.misc,fit,calc}
\usepackage{anyfontsize}
\newcommand{\midfont}{\usefont{T1}{cmr}{b}{n}\fontsize{15}{\baselineskip} \selectfont}
\begin{document}
\begin{tikzpicture}
\node[anchor=south west,inner sep=0] (image) at (0,0) {\includegraphics[width=0.9\textwidth]
{Mycena_interrupta.jpg}};
\begin{scope}[x={(image.south east)},y={(image.north 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 [anchor=east] at (0,\y/10) {0.\y}; }
%\node at ( {.5+0},.5) [ red, line width=2 pt, shape=rounded rectangle,draw, inner xsep=30pt,inner ysep=20pt] (rect){};
\node[fit={($(.5,.5)+(.2,.2)$)($(.5,.5)+(-.2,-.2)$)},shape=rounded rectangle,draw=red,inner sep=0,line width=2pt](rect){};
\node at ( {.5-.3},{.5+.3}) (text){\textcolor{red}{\midfont{Center is Here}}};
\draw [line width=3 pt, red][->] (text) -- (rect);
\node[fit={($(.5,.5)+(.2,.2)$)($(.5,.5)+(-.2,-.2)$)},shape=rectangle,draw=orange,inner sep=0]{};
\end{scope}
\end{tikzpicture}
\end{document}