
У меня есть filldraw
прямоугольник с пользовательским затуханием (например, не только верхняя заливка = color1, нижняя заливка = color2), который определяется с помощью опции, \shade
следующей за этойпочтаТобиас Бринк.
Есть два изменения, которые я хотел бы внести:
- Нарисуйте границу, которая делаетнетзатухает вместе с заливкой, но исчезает везде, где прозрачность установлена на 100 (т.е. белые части)
- Только вокруг северо-восточного и юго-восточного углов? На этот вопрос был дан ответ,
nodes
например, в этомпочта, но у меня не получается заставить его работать здесь. - Текст должен отображаться без прозрачности.
МВЭ
\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}
Это генерирует следующий вывод
решение1
Для первого пункта, боюсь, вам придется спуститься немного ниже. Сохранение границы в обычном состоянии, легко. Исчезновение границы, еще легче. Но вы проситене рисоватьграницатолькокогда затухание полностью прозрачно, и я не думаю, что есть способ сделать это без специального кода.
Для двух других:
- Закругленные углы:Постройте путь одинарными линиями, не используя
rectangle
, оттенок не должен меняться. Например:
\draw (0,0) to[rounded corners] (0,2) to[rounded corners] (2,2) -- (2,0) -- cycle;
- Прозрачность текста:
text opacity
действительно, здесь это не работает, однако вы можете просто заменить все узлом и некоторыми пользовательскими параметрами стиля его границ.
Вот код:
\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}
и результат:
решение2
После отзыва abcdefg о \pgfextra
, я решил поработать над другим решением, которое вы можете оценить сами. Я создал команду
\specrect[ <options> ]{ <position> }{ <text> }
Параметры включают любые параметры, которые вы можете применить к узлу: text width
, text
, minimum width / height / size
и т. д. Единственная настраиваемая опция, которая у вас есть здесь, — это решить, будут ли углы острыми или скругленными (и если да, то насколько), и вы решаете их в следующем порядке (запятая является разделителем):
set corners={ north west, north east, south west, south east }
Если опция не указана, все углы rounded corners=0
, т.е. острые углы. В моем примере ниже я изменил углы вверху, чтобы показать, как это работает.
Выход
Код
\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}
решение3
По запросу: версия без \pgfextra
, которая должна бытьнетиспользовать для операций с путями. Вместо этого можно использовать path picture
. Если нужна граница, в общем случае это можно сделать, просто добавив draw
. В рассматриваемом случае, когда углы скруглены только для некоторых углов, можно использовать append after command
. Обратите внимание, что это не дает вам узел, который «знает», где находится его граница, т. е. он не будет правильно рисовать соединительные пути вблизи скругленных углов. Для этого вам придется определить новую форму.
\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}
Более чистая версия, как утверждают, получается при использованиипрямоугольник с переменными закругленными углами.
\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}