删除部分绘图(或以透明色绘制)

删除部分绘图(或以透明色绘制)

我正在寻找一种方法删除先前绘制的图画的一部分。

一种简单的方法是用背景颜色绘制,但如果背景是透明的,则此方法不起作用。

以下是一个例子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 层上并使用quick 命令完成的,原因有三:

  1. 它们更快,
  2. 他们忽略了转变,
  3. 它们不会更新边界框(尽管您\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}

输出

首次编译

在此处输入图片描述

第二次编译

在此处输入图片描述

相关内容