在以下示例中,我\clip
截取了一个 3x3 矩形图像。我期望结果scope
具有 3x3 的边界框,因此两个文本应该node
与裁剪图片的范围对齐。相反,如果我(0,0)
(3,3)
没有剪辑图像。
\documentclass[margin=3mm,tikz]{standalone}
\usepackage{tikz}
\usepackage{mwe}
\begin{document}
\begin{tikzpicture}
\begin{scope}
\clip (9, 5) rectangle ++ (-3,-3);
\node[anchor=south west,inner sep=0] at (0,0)
{\includegraphics[width=0.9\textwidth]{example-image.jpg}};
\end{scope}
\draw (0,0) node{(0,0)};
\draw (3,3) node{(3,3)};
\end{tikzpicture}
\end{document}
我如何剪辑scope
以便其边界框从(0,0)
到(3,3)
同时保持与当前相同的内容?例如,我想要这样:
(请注意,这是一个简化的示例。在我的实际用例中,有很多绘制发生(并且不涉及图像)scope
,所以这与使用图像无关)
答案1
正如@SebGlav 所提到的,您似乎正在寻找两个命令的组合clip
(定义图像的哪部分可见)和shift
(改变原点)。
为了简化这个双重命令,您可以定义一个clip and shift
完成该任务的新样式。
\documentclass[tikz,border=7pt]{standalone}
\tikzset{
% usage in scope style: clip and shift={path}
clip and shift/.code = {
\clip #1 (current path bounding box.south west)
coordinate (clip and shift origin);
},
clip and shift/.append style = {shift={(clip and shift origin)}}
}
\begin{document}
\begin{tikzpicture}
\fill[red] (9,5) circle(3pt) node[above right]{(9,5)};
\fill[red] (7,2) circle(3pt) node[below left]{(7,2)};
\begin{scope}[clip and shift={(9,5) rectangle +(-2,-3)}]
\node[anchor=south west,inner sep=0] at (0,0)
{\includegraphics[width=0.9\textwidth]{example-image.jpg}};
\fill[blue] (0,0) circle(3pt) node[above right]{(0,0)};
\fill[blue] (2,3) circle(3pt) node[below left]{(2,3)};
\end{scope}
\end{tikzpicture}
\end{document}
编辑:该代码已根据评论中的@cactus 请求进行修改。
答案2
也许你会发现use as bounding box
语法很有趣。然后使用带有移动坐标系的范围。
\documentclass[border=3.14mm,tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\begin{scope}
\clip (6,2) rectangle (9,5);
\node[anchor=south west,inner sep=0] at (0,0)
{\includegraphics[width=0.9\textwidth]{example-image.jpg}};
\useasboundingbox (6,2) rectangle (9,5);
\end{scope}
\begin{scope}[xshift=6cm,yshift=2cm]
\draw[red] (0,0) grid (3,3);
\path (0,0) node{(0,0)};
\path (3,3) node{(3,3)};
\end{scope}
\end{tikzpicture}
\end{document}
编辑
如果您想将剪辑用作边界框(而不是再次输入它),您可以将剪辑定义为可重复使用的路径:
\documentclass[border=3.14mm,tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\def\clipbox{(6,2) rectangle (9,5)} % <--- Define here
\begin{scope}
\clip \clipbox; % <--- Use here
\node[anchor=south west,inner sep=0] at (0,0)
{\includegraphics[width=0.9\textwidth]{example-image.jpg}};
\useasboundingbox \clipbox; % <--- And use there
\end{scope}
\begin{scope}[xshift=6cm,yshift=2cm]
\draw[red] (0,0) grid (3,3);
\path (0,0) node{(0,0)};
\path (3,3) node{(3,3)};
\end{scope}
\end{tikzpicture}
\end{document}