Überblenden in TikZ bearbeiten

Überblenden in TikZ bearbeiten

Ich habe ein filldrawRechteck mit benutzerdefiniertem Fading (also mehr als nur obere Füllung = Farbe1, untere Füllung = Farbe2 zum Beispiel), das mit der \shadefolgenden Option definiert wirdPostvon Tobias Brink.

Ich möchte zwei Änderungen vornehmen:

  1. Zeichnen Sie eine Grenze, dienichtverblasst mit der Füllung, verschwindet aber überall dort, wo die Transparenz auf 100 eingestellt ist (also die weißen Teile)
  2. Nur um die nordöstlichen und südöstlichen Ecken? Dies wurde beispielsweise nodesin diesem beantwortetPost, aber ich bekomme es hier nicht zum Laufen.
  3. Der Text sollte ohne Transparenz erscheinen.

MWE

\documentclass[tikz]{standalone} \usetikzlibrary{fadings}

\begin{tikz fadinfrompicture}[name=myfading]   
\clip (0,0) rectangle (2,2);   
\shade [top color=transparent!100, bottom color=transparent!0] (0,0) rectangle (2,0.38);                 
\shade [top color=transparent!10, bottom color=transparent!100] (0,0.68) rectangle (2,0.92);               
\shade [top color=transparent!100, bottom color=transparent!10] (0,0.92) rectangle (2,1.16);                     
\shade [top color=transparent!0, bottom color=transparent!100] (0,1.59) rectangle (2,2);                     
\end{tikzfadingfrompicture}

\begin{document}

\begin{tikzpicture} 
\filldraw [blue, path fading=myfading, draw=black, line width=1mm, text opacity = 1] (10,0) rectangle (19,-11.5) node[pos=.5,text width=8 cm] {Some text without transparency}; 
\end{tikzpicture}

\end{document}

Dies erzeugt die folgende Ausgabe

Ausgabe

Antwort1

Für den ersten Punkt müssen Sie leider etwas tiefer gehen. Die Ränder wie gewohnt zu belassen, ist einfach. Die Ränder auszublenden, ist sogar noch einfacher. Aber Sie bitten darum,nicht zeichnendie Grenzenurwenn die Überblendung vollständig transparent ist, und ich glaube nicht, dass es eine Möglichkeit gibt, dies ohne benutzerdefinierten Code zu tun.

Für die anderen beiden:

  • Abgerundete Ecken:Bauen Sie den Pfad mit einzelnen Linien auf, ohne zu verwenden rectangle, der Farbton sollte sich nicht ändern. Beispiel:
    \draw (0,0) to[rounded corners] (0,2) to[rounded corners] (2,2) -- (2,0) -- cycle;
  • Texttransparenz: text opacityfunktioniert hier zwar nicht, Sie können jedoch einfach alles durch einen Knoten und einige benutzerdefinierte Optionen für den Rahmenstil ersetzen.

Hier ist der Code:

\documentclass[tikz,margin=10pt]{standalone} 

\usetikzlibrary{fadings}
\definecolor{myblue}{RGB}{80,103,173}% my blue is different than yours

\begin{tikzfadingfrompicture}[name=myfading]   
\clip (0,0) rectangle (2,2);   
\shade [top color=transparent!100, bottom color=transparent!0] (0,0) rectangle (2,0.38);                 
\shade [top color=transparent!10, bottom color=transparent!100] (0,0.68) rectangle (2,0.92);               
\shade [top color=transparent!100, bottom color=transparent!10] (0,0.92) rectangle (2,1.16);                     
\shade [top color=transparent!0, bottom color=transparent!100] (0,1.59) rectangle (2,2);                     
\end{tikzfadingfrompicture}

\tikzset{
    special/.style={%
        text=myblue,
        minimum height=10cm,
        minimum width=10cm,
        inner sep=0,
        text width=8cm,
        append after command={% custom border and fill!
            \pgfextra
            \fill[preaction={draw=black,line width=1mm}, myblue, path fading=myfading]
            (\tikzlastnode.south west) to[rounded corners=1cm] 
            (\tikzlastnode.north west) to[rounded corners=1cm] 
            (\tikzlastnode.north east) -- 
            (\tikzlastnode.south east) -- cycle; 
            \endpgfextra 
        }
    }
}

\begin{document}

\begin{tikzpicture} 
    \node[special] at (5,5) {Some text without transparency\\Some text without transparency\\Some text without transparency\\Some text without transparency\\Some text without transparency\\Some text without transparency\\Some text without transparency\\}; 
\end{tikzpicture}

\end{document}

und das Ergebnis:

Bildbeschreibung hier eingeben

Antwort2

Nach dem Feedback von abcdefg zu \pgfextrahabe ich beschlossen, an einer anderen Lösung zu arbeiten, die Sie selbst beurteilen können. Ich habe den Befehl

\specrect[ <options> ]{ <position> }{ <text> }

Die Optionen umfassen alle Optionen, die Sie auf einen Knoten anwenden können: text width, text, minimum width / height / size, usw. Die einzige benutzerdefinierte Option, die Sie hier haben, ist die Entscheidung, ob die Ecken scharf oder abgerundet sind (und wenn ja, wie stark). Sie entscheiden in dieser Reihenfolge (das Komma ist das Trennzeichen):

set corners={ north west, north east, south west, south east }

Wenn die Option nicht angegeben ist, sind alle Ecken rounded corners=0, also scharfe Ecken. In meinem Beispiel unten habe ich die Ecken oben geändert, um zu zeigen, wie es funktioniert.

Ausgabe

Bildbeschreibung hier eingeben

Code

\documentclass[tikz, margin=10pt]{standalone} 

\usetikzlibrary{fadings}
\definecolor{myblue}{RGB}{80,103,173}

\begin{tikzfadingfrompicture}[name=myfading]   
\clip (0,0) rectangle (2,2);   
\shade [top color=transparent!100, bottom color=transparent!0] (0,0) rectangle (2,0.38);                 
\shade [top color=transparent!10, bottom color=transparent!100] (0,0.68) rectangle (2,0.92);               
\shade [top color=transparent!100, bottom color=transparent!10] (0,0.92) rectangle (2,1.16);                     
\shade [top color=transparent!0, bottom color=transparent!100] (0,1.59) rectangle (2,2);                     
\end{tikzfadingfrompicture}

\pgfkeys{/tikz/.cd,% to set the path
    nwcorner/.initial=0,
    nwcorner/.get=\nwcorner,
    nwcorner/.store in=\nwcorner,
    necorner/.initial=0,
    necorner/.get=\necorner,
    necorner/.store in=\necorner,
    swcorner/.initial=0,
    swcorner/.get=\swcorner,
    swcorner/.store in=\swcorner,
    secorner/.initial=0,
    secorner/.get=\secorner,
    secorner/.store in=\secorner,
    set corners/.style args={#1,#2,#3,#4}{nwcorner=#1,necorner=#2,swcorner=#3,secorner=#4},
}

\newcommand\specrect[3][]{%
    \tikzset{nwcorner=0,necorner=0,swcorner=0,secorner=0,set corners={0,0,0,0},#1} 
    \node (specialr) at (#2) {};
    \filldraw[preaction={draw=black, line width=1mm},myblue, path fading=myfading] 
        (specialr.south west) to[rounded corners=\nwcorner] 
        (specialr.north west) to[rounded corners=\necorner] 
        (specialr.north east) to[rounded corners=\swcorner]  
        (specialr.south east) to[rounded corners=\secorner] cycle;
    \node at (#2) {#3};
}

\begin{document}
\begin{tikzpicture}
\specrect[
    text=myblue,
    minimum height=10cm,
    minimum width=10cm,
    inner sep=0,
    text width=8cm,
    set corners={1cm,3cm,0,0}% nw, ne, sw, se
    ]{0,0}{Some text without transparency}
\end{tikzpicture}
\end{document}

Antwort3

Auf Anfrage: eine Version ohne \pgfextra, welche mannichtfür Pfadoperationen verwenden. path pictureStattdessen kann ein verwendet werden. Wenn eine Grenze gewünscht wird, kann dies im Allgemeinen durch einfaches Hinzufügen von erreicht werden draw. Im vorliegenden Fall mit den abgerundeten Ecken für nur einige Ecken kann verwendet werden append after command. Beachten Sie, dass Sie dadurch keinen Knoten erhalten, der „weiß“, wo seine Grenze ist, d. h. Verbindungspfade in der Nähe der abgerundeten Ecken werden nicht korrekt gezeichnet. Dafür müssten Sie eine neue Form definieren.

\documentclass[tikz]{standalone} 
\usetikzlibrary{calc,fadings}

\begin{tikzfadingfrompicture}[name=myfading]   
\clip (0,0) rectangle (2,2);   
\shade [top color=transparent!100, bottom color=transparent!0] (0,0) rectangle (2,0.38);                 
\shade [top color=transparent!10, bottom color=transparent!100] (0,0.68) rectangle (2,0.92);               
\shade [top color=transparent!100, bottom color=transparent!10] (0,0.92) rectangle (2,1.16);                     
\shade [top color=transparent!0, bottom color=transparent!100] (0,1.59) rectangle (2,2);                     
\end{tikzfadingfrompicture}

\begin{document}

\begin{tikzpicture}[faded/.style={path picture={
\fill[blue, path fading=myfading]
    let \p1=($(path picture bounding box.north east)-(path picture bounding box.south west)$),
     \n1={0.15*min(\x1,\y1)} in [rounded corners=\n1]
            (path picture bounding box.south west) |- 
            (path picture bounding box.north east) [sharp corners] |- cycle;
},append after command={[ultra thick] let
\p1=($(\tikzlastnode.north east)-(\tikzlastnode.south west)$),
     \n1={0.15*min(\x1,\y1)} in 
(\tikzlastnode.south west) edge[ultra thick,line cap=rect,vh path,rounded corners=\n1] (\tikzlastnode.north)
(\tikzlastnode.south east) edge[ultra thick,line cap=rect,vh path,rounded corners=\n1] (\tikzlastnode.north)
(\tikzlastnode.south west) edge[ultra thick,line cap=rect] (\tikzlastnode.south east)
}},vh path/.style={to path={|- (\tikztotarget)}}] 
\path  node[minimum size=10cm,text width=8cm,faded] 
{Some text without transparency}; 
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Eine sauberere Version erhält man durch die Verwendung vonRechteck mit unterschiedlich abgerundeten Ecken.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}
\usetikzlibrary{calc,fadings}

\begin{tikzfadingfrompicture}[name=myfading]   
\clip (0,0) rectangle (2,2);   
\shade [top color=transparent!100, bottom color=transparent!0] (0,0) rectangle (2,0.38);                 
\shade [top color=transparent!10, bottom color=transparent!100] (0,0.68) rectangle (2,0.92);               
\shade [top color=transparent!100, bottom color=transparent!10] (0,0.92) rectangle (2,1.16);                     
\shade [top color=transparent!0, bottom color=transparent!100] (0,1.59) rectangle (2,2);                     
\end{tikzfadingfrompicture}

\begin{document}

\makeatletter
% from https://tex.stackexchange.com/a/118786/228539
\pgfkeys{/pgf/.cd,
  rectangle corner radius north west/.initial=0pt,
  rectangle corner radius north east/.initial=0pt,
  rectangle corner radius south west/.initial=0pt,
  rectangle corner radius south east/.initial=0pt
}
\newif\ifpgf@rectanglewrc@donecorner@
\def\pgf@rectanglewithroundedcorners@docorner#1#2#3#4#5{%
  \edef\pgf@marshal{%
    \noexpand\pgfintersectionofpaths
      {%
        \noexpand\pgfpathmoveto{\noexpand\pgfpoint{\the\pgf@xa}{\the\pgf@ya}}%
        \noexpand\pgfpathlineto{\noexpand\pgfpoint{\the\pgf@x}{\the\pgf@y}}%
      }%
      {%
        \noexpand\pgfpathmoveto{\noexpand\pgfpointadd
          {\noexpand\pgfpoint{\the\pgf@xc}{\the\pgf@yc}}%
          {\noexpand\pgfpoint{#1}{#2}}}%
        \noexpand\pgfpatharc{#3}{#4}{#5}%
      }%
    }%
  \pgf@process{\pgf@marshal\pgfpointintersectionsolution{1}}%
  \pgf@process{\pgftransforminvert\pgfpointtransformed{}}%
  \pgf@rectanglewrc@donecorner@true
}
\pgfdeclareshape{rectangle with rounded corners}
{
  \inheritsavedanchors[from=rectangle] % this is nearly a rectangle
  \inheritanchor[from=rectangle]{north}
  \inheritanchor[from=rectangle]{north west}
  \inheritanchor[from=rectangle]{north east}
  \inheritanchor[from=rectangle]{center}
  \inheritanchor[from=rectangle]{west}
  \inheritanchor[from=rectangle]{east}
  \inheritanchor[from=rectangle]{mid}
  \inheritanchor[from=rectangle]{mid west}
  \inheritanchor[from=rectangle]{mid east}
  \inheritanchor[from=rectangle]{base}
  \inheritanchor[from=rectangle]{base west}
  \inheritanchor[from=rectangle]{base east}
  \inheritanchor[from=rectangle]{south}
  \inheritanchor[from=rectangle]{south west}
  \inheritanchor[from=rectangle]{south east}

  \savedmacro\cornerradiusnw{%
    \edef\cornerradiusnw{\pgfkeysvalueof{/pgf/rectangle corner radius north west}}%
  }
  \savedmacro\cornerradiusne{%
    \edef\cornerradiusne{\pgfkeysvalueof{/pgf/rectangle corner radius north east}}%
  }
  \savedmacro\cornerradiussw{%
    \edef\cornerradiussw{\pgfkeysvalueof{/pgf/rectangle corner radius south west}}%
  }
  \savedmacro\cornerradiusse{%
    \edef\cornerradiusse{\pgfkeysvalueof{/pgf/rectangle corner radius south east}}%
  }

  \backgroundpath{%
    \northeast\advance\pgf@y-\cornerradiusne\relax
    \pgfpathmoveto{}%
    \pgfpatharc{0}{90}{\cornerradiusne}%
    \northeast\pgf@ya=\pgf@y\southwest\advance\pgf@x\cornerradiusnw\relax\pgf@y=\pgf@ya
    \pgfpathlineto{}%
    \pgfpatharc{90}{180}{\cornerradiusnw}%
    \southwest\advance\pgf@y\cornerradiussw\relax
    \pgfpathlineto{}%
    \pgfpatharc{180}{270}{\cornerradiussw}%
    \northeast\pgf@xa=\pgf@x\advance\pgf@xa-\cornerradiusse\southwest\pgf@x=\pgf@xa
    \pgfpathlineto{}%
    \pgfpatharc{270}{360}{\cornerradiusse}%
    \northeast\advance\pgf@y-\cornerradiusne\relax
    \pgfpathlineto{}%
    \pgfpathclose
  }

  \anchor{before north east}{\northeast\advance\pgf@y-\cornerradiusne}
  \anchor{after north east}{\northeast\advance\pgf@x-\cornerradiusne}
  \anchor{before north west}{\southwest\pgf@xa=\pgf@x\advance\pgf@xa\cornerradiusnw
    \northeast\pgf@x=\pgf@xa}
  \anchor{after north west}{\northeast\pgf@ya=\pgf@y\advance\pgf@ya-\cornerradiusnw
    \southwest\pgf@y=\pgf@ya}
  \anchor{before south west}{\southwest\advance\pgf@y\cornerradiussw}
  \anchor{after south west}{\southwest\advance\pgf@x\cornerradiussw}
  \anchor{before south east}{\northeast\pgf@xa=\pgf@x\advance\pgf@xa-\cornerradiusse
    \southwest\pgf@x=\pgf@xa}
  \anchor{after south east}{\southwest\pgf@ya=\pgf@y\advance\pgf@ya\cornerradiusse
    \northeast\pgf@y=\pgf@ya}

  \anchorborder{%
    \pgf@xb=\pgf@x% xb/yb is target
    \pgf@yb=\pgf@y%
    \southwest%
    \pgf@xa=\pgf@x% xa/ya is se
    \pgf@ya=\pgf@y%
    \northeast%
    \advance\pgf@x by-\pgf@xa%
    \advance\pgf@y by-\pgf@ya%
    \pgf@xc=.5\pgf@x% x/y is half width/height
    \pgf@yc=.5\pgf@y%
    \advance\pgf@xa by\pgf@xc% xa/ya becomes center
    \advance\pgf@ya by\pgf@yc%
    \edef\pgf@marshal{%
      \noexpand\pgfpointborderrectangle
      {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}
      {\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
    }%
    \pgf@process{\pgf@marshal}%
    \advance\pgf@x by\pgf@xa% 
    \advance\pgf@y by\pgf@ya%
    \pgfextract@process\borderpoint{}%
    %
    \pgf@rectanglewrc@donecorner@false
    %
    % do southwest corner
    \southwest\pgf@xc=\pgf@x\pgf@yc=\pgf@y
    \advance\pgf@xc\cornerradiussw\relax\advance\pgf@yc\cornerradiussw\relax 
    \borderpoint
    \ifdim\pgf@x<\pgf@xc\relax\ifdim\pgf@y<\pgf@yc\relax
      \pgf@rectanglewithroundedcorners@docorner{-\cornerradiussw}{0pt}{180}{270}{\cornerradiussw}%
    \fi\fi
    %
    % do southeast corner
    \ifpgf@rectanglewrc@donecorner@\else
      \southwest\pgf@yc=\pgf@y\relax\northeast\pgf@xc=\pgf@x\relax
      \advance\pgf@xc-\cornerradiusse\relax\advance\pgf@yc\cornerradiusse\relax
      \borderpoint
      \ifdim\pgf@x>\pgf@xc\relax\ifdim\pgf@y<\pgf@yc\relax
       \pgf@rectanglewithroundedcorners@docorner{0pt}{-\cornerradiusse}{270}{360}{\cornerradiusse}%
      \fi\fi
    \fi
    %
    % do northeast corner
    \ifpgf@rectanglewrc@donecorner@\else
      \northeast\pgf@xc=\pgf@x\relax\pgf@yc=\pgf@y\relax
      \advance\pgf@xc-\cornerradiusne\relax\advance\pgf@yc-\cornerradiusne\relax
      \borderpoint
      \ifdim\pgf@x>\pgf@xc\relax\ifdim\pgf@y>\pgf@yc\relax
       \pgf@rectanglewithroundedcorners@docorner{\cornerradiusne}{0pt}{0}{90}{\cornerradiusne}%
      \fi\fi
    \fi
    %
    % do northwest corner
    \ifpgf@rectanglewrc@donecorner@\else
      \northeast\pgf@yc=\pgf@y\relax\southwest\pgf@xc=\pgf@x\relax
      \advance\pgf@xc\cornerradiusnw\relax\advance\pgf@yc-\cornerradiusnw\relax
      \borderpoint
      \ifdim\pgf@x<\pgf@xc\relax\ifdim\pgf@y>\pgf@yc\relax
       \pgf@rectanglewithroundedcorners@docorner{0pt}{\cornerradiusnw}{90}{180}{\cornerradiusnw}%
      \fi\fi
    \fi
  }
}

\makeatother

\begin{tikzpicture}[faded/.style={path picture={
\fill[blue, path fading=myfading]
            (path picture bounding box.south west) rectangle 
            (path picture bounding box.north east);}}] 
\path node[rectangle with rounded corners,minimum size=10cm,
    text width=8cm,faded,draw,ultra thick,font=\sffamily, 
    rectangle corner radius north west=20pt] 
{Some text without transparency}; 
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen