Ich möchte eine horizontale Schattierung definieren, die je nach Bedarf gestreckt werden kann. Was ich bisher getan habe, ist dies
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\pgfdeclarehorizontalshading{pressure}{1cm}{color(0cm)=(black!30); color(1cm)=(black!50); color(3cm)=(black!10); color(4cm)=(black!30)}
\shade[shading=pressure] (0,0) rectangle (10cm,2cm);
\end{tikzpicture}
\end{document}
aber es funktioniert einfach nicht. Warum?
BEARBEITEN: Das istnichtüber ausgefallenen Hintergrund. Ich muss die Änderungen des Luftdrucks darstellen und habe keine genauen Maße des Rechtecks. Hätte ich die genauen Maße des Rechtecks gekannt ( \leng
), könnte ich verwenden 0.25*\leng
, 0.75*\leng
und\leng
Antwort1
Wie im Handbuch beschrieben, wird die Schattierung so skaliert, dass die mittleren 50 % den Pfad ausfüllen, was zwar in vielen Fällen nützlich ist (insbesondere bei übermäßig nicht rechteckigen Pfaden oder gedrehten Schattierungen), in diesem Fall jedoch etwas störend ist.
Man kann diese Funktion jedoch ausnutzen path picture
, die Größe des Pfads ermitteln und die Schattierung manuell skalieren. Dies erfordert einige grundlegende Ebenentricks und es wird keine Schattierungsrotation unterstützt (zumindest im folgenden Beispiel). Die Standardschattierung befindet sich links, die Schattierung des Pfadbilds befindet sich rechts:
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{calc}
\newbox\shbox
\tikzset{%
path picture shading/.style={%
path picture={%
%
\pgfpointdiff{\pgfpointanchor{path picture bounding box}{south west}}%
{\pgfpointanchor{path picture bounding box}{north east}}%
\pgfgetlastxy\pathwidth\pathheight%
\pgfinterruptpicture%
\global\setbox\shbox=\hbox{\pgfuseshading{#1}}%
\endpgfinterruptpicture%
\pgftransformshift{\pgfpointanchor{path picture bounding box}{center}}%
\pgftransformxscale{\pathwidth/(\wd\shbox)}%
\pgftransformyscale{\pathheight/(\ht\shbox)}% \dp will (should) be 0pt
\pgftext{\box\shbox}%
%
}
}
}
\pgfdeclarehorizontalshading{pressure}{25bp}{color(0bp)=(red); color(25bp)=(yellow); color(50bp)=(pink); color(75bp)=(green); color(100bp)=(blue)}
\begin{document}
\begin{tikzpicture}
\node at (3,0) {\tt shading=pressure};
\node at (9,0) {\tt path picture shading=pressure};
\foreach \i in {1,...,6}{
\draw [shading=pressure] (0,\i) rectangle +(\i,1);
\draw [path picture shading=pressure] (7,\i) rectangle +(\i,1);
}
\end{tikzpicture}
\end{document}
Antwort2
Ihre Schattierung funktioniert sehr gut! Es gibt immer einige versteckte Teile in einer Schattierung (vgl. pgfmanual S. 1090 von TikZ/PGF v3.0).
Wenn Sie die gesamte Schattierung verwenden möchten, können Sie sie \pgfuseshading{pressure}
als Inhalt eines Knotens verwenden xscale
und yscale
ihre Größe ändern (und inner sep=0
unerwünschte Ränder entfernen).
Bearbeiten:Mithilfe der calc
TikZ-Bibliothek können Sie die Skalierungsfaktoren berechnen.
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\pgfdeclarehorizontalshading{pressure}{1cm}{
color(0cm)=(red);
color(1cm)=(black!50);
color(2cm)=(yellow!10);
color(3cm)=(blue)
}
\begin{document}
\begin{tikzpicture}
\node[inner sep=0,xscale=10/3,yscale=2/1]
at (0,0) {\pgfuseshading{pressure}};
\node[inner sep=0,xscale=10/3,yscale=.5/1]
at (0,2) {\pgfuseshading{pressure}};
\coordinate (a) at (-2,5);
\coordinate (b) at (8,6);
\path let \p1=(a), \p2=(b),
\p3=({(\x2-\x1)/3cm},{(\y2-\y1)/1cm}),
\p4=($(\p1)!.5!(\p2)$)
in node[at=(\p4),inner sep=0,xscale=\x3,yscale=\y3]{\pgfuseshading{pressure}};
\end{tikzpicture}
\end{document}
Antwort3
Sie können jederzeit einSchönBild als Hintergrund.
\documentclass{article}
\usepackage{tikz, graphicx}
\begin{document}
\begin{tikzpicture}
\node[inner sep=0pt] (x) at (0,0)
{\includegraphics[width=.5\textwidth]{bg.jpg}};
\node[inner sep=0pt] (y) at (5,-6)
{\includegraphics[width=.25\textwidth]{bg.jpg}};
\draw[<->,thick] (x.south east) -- (y.north west)
node[midway,fill=white] {Backgrounds};
\end{tikzpicture}
\end{document}
Dehnen Sie es mithilfe der width
Taste.