Estou procurando uma maneira de usar transparência/opacidade para destacar uma área específica em uma figura TikZ que gerei. Para ser mais específico, tenho uma figura TikZ que ilustra a relação entre vários conceitos. Depois de mostrar esta figura pela primeira vez, quero reutilizá-la posteriormente em meu documento, quando discutir conceitos específicos com mais detalhes. Para deixar claro qual conceito da figura é discutido, quero destacar a parte relevante da figura. Seria bom se houvesse uma maneira de deixar a parte relevante da figura inalterada e tornar o resto da figura um pouco desbotado usando a opacidade. Existe uma maneira simples de fazer isso?
Atualização: Aqui está um MWE:
\documentclass[10pt]{article}
\usepackage{tikz}
\usepackage{fancyhdr}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}[
opacity=0.5,
box/.style={rectangle,draw=black,
minimum size=1cm,text width=2.2cm,text centered,font=\small}]
%%% coordinates
\coordinate (CM) at ( 0.0, 3.0);
\coordinate (DM) at ( 0.0, 6.0);
\coordinate (MM) at ( 0.0, 9.0);
\coordinate (PR) at ( 0.0,12.0);
%%% nodes
\node[box] (cm) at (CM) {box 1};
\node[box] (dm) at (DM) {box 2};
\node[box] (mm) at (MM) {box 3};
\node[box] (pr) at (PR) {box 4};
%%% arrows
\draw[->] (dm.south) --
node[fill=white,align=center,text width=3.5cm,font=\small]
{\textsl{proc 1}} (cm.north);
\begin{scope}[opacity=1.0]
\draw[->] (mm.south) --
node[fill=white,align=center,text width=3.3cm,font=\small]
{\textsl{proc 2}} (dm.north);
\end{scope}
\draw[->] (pr.south) --
node[fill=white,align=center,text width=3.5cm,font=\small]
{\textsl{proc 3}} (mm.north);
\end{tikzpicture}
\end{document}
Isso não faz exatamente o que eu quero porque: (1) eu gostaria de poder especificar um círculo ou retângulo que contenha a parte destacada da figura, em vez de ter que selecionar explicitamente quais comandos não devem estar em segundo plano. (2) Idealmente, eu gostaria de não ter que modificar a fonte básica da figura para poder mantê-la em um arquivo separado e simplesmente inseri-la e adicionar o comando para selecionar a parte a ser destacada. (3) O texto sobreposto às setas funciona bem devido ao fundo branco quando não há opacidade. Mas com a opacidade, o fundo branco não cobre mais a seta. Existe uma solução mais fácil do que desenhar as setas em duas partes?
Responder1
Você pode desenhar uma máscara semitransparente sobre a existente tikzpicture
usando remember picture
para disponibilizar as coordenadas. As fotos mostram a máscara em vermelho para demonstração e em branco para aplicação real:
\documentclass[10pt]{article}
\usepackage{tikz}
\usepackage{fancyhdr}
\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}[remember picture,
box/.style={rectangle,draw=black,
minimum size=1cm,text width=2.2cm,text centered,font=\small}]
%%% coordinates
\coordinate (CM) at ( 0.0, 3.0);
\coordinate (DM) at ( 0.0, 6.0);
\coordinate (MM) at ( 0.0, 9.0);
\coordinate (PR) at ( 0.0,12.0);
%%% nodes
\node[box] (cm) at (CM) {box 1};
\node[box] (dm) at (DM) {box 2};
\node[box] (mm) at (MM) {box 3};
\node[box] (pr) at (PR) {box 4};
%%% arrows
\draw[->] (dm.south) --
node[fill=white,align=center,text width=3.5cm,font=\small] (proc1)
{\textsl{proc 1}} (cm.north);
\draw[->] (mm.south) --
node[fill=white,align=center,text width=3.3cm,font=\small]
{\textsl{proc 2}} (dm.north);
\draw[->] (pr.south) --
node[fill=white,align=center,text width=3.5cm,font=\small]
{\textsl{proc 3}} (mm.north);
\coordinate (diagramNW) at (current bounding box.north west);
\coordinate (diagramSE) at (current bounding box.south east);
\end{tikzpicture}
%% The mask
\begin{tikzpicture}[remember picture, overlay]
\fill [red, opacity=0.5,even odd rule]
(diagramNW) rectangle (diagramSE) % Cover up everything
(mm.north west) rectangle (dm.south east) % Cut out a rectangular area;
(proc1) circle [radius=0.5cm];
\end{tikzpicture}
\end{document}