我正在寻找一种方法删除先前绘制的图画的一部分。
一种简单的方法是用背景颜色绘制,但如果背景是透明的,则此方法不起作用。
以下是一个例子file.tex
:
\documentclass[convert={density=100,outext=.png}]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
% draw a black line
\draw (0,0) -- (2,1);
% "delete" part of the line
\draw[fill,color=white](0.5,0) rectangle (1.5,1);
\end{tikzpicture}
\end{document}
我使用standalone
该类来生成单张图片。当使用运行时pdflatex -shell-escape file.tex
,它将同时生成以下两张图片:
file.pdf
file.png
pdf 看起来很好,因为背景确实是白色的。
png 是通过 imagemagickconvert
工具构建的,具有透明背景,因此“已删除”部分显示为白色矩形。
我知道我可以使用-alpha remove -background white
选项
convert
将背景变成白色,但我更喜欢相反的做法:拥有透明背景,包括“删除矩形”。
我想过使用反向剪辑(例如 如何在 TikZ 中反转“剪辑”选择?) 但我无法提前知道我不想绘制哪个部分,因此需要删除而不是首先避免绘制不需要的部分。
有什么办法可以做到这一点?
答案1
采取保存文件路径的想法aux
,以便下次运行时可用。
我没有进行太多测试,但对于这个例子,它是有效的。我可能经验知道如何使用aux
文件,但我不是专家。使用external
库将图片外部化不起作用。
在 TikZ 的任何路径上,您都可以使用
remember path = <name>
密钥,以便下次编译时可以使用,并且remembered path = <name>
使用此路径的密钥(如果可用)。
该键将用作\pgfpictureid
前缀,以便您可以在不同的图片中指定相同的路径名。
我还定义了一个reverse clip
键,它支持顺时针和逆时针矩形,并具有最大支持尺寸。这是在 PGF 层上并使用q
uick 命令完成的,原因有三:
- 它们更快,
- 他们忽略了转变,
- 它们不会更新边界框(尽管您
\path[remember path=…]
可能无论如何都会使用overlay
)。
使用方法如下:
\begin{tikzpicture}
\fill[left color=blue, right color=green] (0,0) rectangle (2,1);
\clip[remembered path=box];
\draw (0,0) -- (2,1);
\path[remember path=box] (0.5, 0) rectangle (1.5, 1) [reverse clip];
\end{tikzpicture}
代码
\documentclass[border=5pt, tikz, convert]{standalone}
% Part 1: Quick PGF versions of reverse clips.
%% * uses quick commands that
%% * ignore transformations and
%% * don't contribute to the bounding box (we use overlay though anyway)
%% * only uses 16000pt since this is what PGF does, too (TeX'd allow 16384pt)
%% * clockwise and counterclockwise for nonzero and even odd rule
%%
\tikzset{% quick versions of reverse clips
reverse clip/.is choice,
reverse clip/clockwise/.code={%
\pgfpathqmoveto{16000pt}{16000pt}%
\pgfpathqlineto{16000pt}{-16000pt}%
\pgfpathqlineto{-16000pt}{-16000pt}%
\pgfpathqlineto{-16000pt}{16000pt}%
\pgfpathclose},
reverse clip/counter clockwise/.code={%
\pgfpathqmoveto{16000pt}{16000pt}%
\pgfpathqlineto{-16000pt}{16000pt}%
\pgfpathqlineto{-16000pt}{-16000pt}%
\pgfpathqlineto{16000pt}{-16000pt}%
\pgfpathclose},
reverse clip/.default=counter clockwise}
% Part 2: The actual keys
% that save/use the path to/from the aux file.
%% * remember path will does what ever you do on the path
%% and save it to the aux file
%% * remembered path will set the remembers path (if available)
%% and use it as specified
%%
\makeatletter
\tikzset{
remember path/.code={%
\tikz@addmode{%
\expandafter\pgfsyssoftpath@getcurrentpath\csname qrr@tikzpath@\pgfpictureid @#1\endcsname
\immediate\write\pgfutil@auxout{%
\noexpand\expandafter\gdef\noexpand\csname qrr@tikzpath@\pgfpictureid @#1\endcsname{%
\expandafter\expandafter\expandafter\unexpanded
\expandafter\expandafter\expandafter{\csname qrr@tikzpath@\pgfpictureid @#1\endcsname}}}}%
},
remembered path/.code={%
\pgfutil@IfUndefined{qrr@tikzpath@\pgfpictureid @#1}{}{%
\tikz@addmode{%
\expandafter\pgfsyssoftpath@setcurrentpath
\expandafter{\csname qrr@tikzpath@\pgfpictureid @#1\endcsname}}}}}
\makeatother
\begin{document}
\begin{tikzpicture}
\fill[left color=blue, right color=green] (0,0) rectangle (2,1);
\clip[remembered path=box];
\draw (0,0) -- (2,1);
\path[remember path=box] (0.5, 0) rectangle (1.5, 1) [reverse clip];
\end{tikzpicture}
\end{document}