%!TEX root = tzplot-doc.tex %\begin{document} %%%========================== \part{Plotting Graphs} %%%========================== \label{p:plotting} %%================================== \chapter{Axes} \label{c:axes} %%------------------------------------------------------------ \section{Draw axes} \label{s:tzaxes} \subsection{\protect\cmd{\tzaxes}} \label{ss:tzaxes} Basically, \icmd{\tzaxes}|()()| draws the $x$ axis from || to || and the $y$ axis from || to ||. The coordinate |()| represents the origin and |()| represents the opposite corner of the rectangle formed by the two coordinates. |\tzaxes| takes only one coordinate |()| as a mandatory argument, in which case the coordinate |()| is considered as |(0,0)|. \begin{tzdef} % syntax: minimal \tzaxes(){}{} % syntax: full \tzaxes[]""()() {}[]{}[] % defaults [->]<0,0>"axes"(0,0)(){}[right]{}[above] % arguments [#1]: line style, arrow type (for x-axis & y-axis) <#2>: axes shift coor %% axes intersect at (#2) "#3": name path=#3 %% default: axes (#4): (x1,y1) %% origin: if omitted, regarded as (0,0) (#5): (x2,y2) %% opposite corner: mandatory {#6}: x-axis label [#7]: x-axis label option %% node option {#8}: y-axis label [#9]: y-axis label option %% node option \end{tzdef} Here, |(|\ixxw{}|)| stands for a mandatory argument. \begin{tzcode}{.3} % tzaxes \begin{tikzpicture}[scale=.7] \tzhelplines(4,3) \tzaxes(4,3){$x$}{$y$} \end{tikzpicture} \end{tzcode} \paragraph{Shift} By default, the $x$ and $y$ axes intersect at $(0,0)$. Specifying the option || shifts the axes to intersect at $(\text{\ttfamily})$. \begin{tzcode}{.3} % tzaxes: intersects at (1,.5) \begin{tikzpicture}[scale=.7] \tzhelplines(4,3) \tzaxes<1,.5>(4,3){$x$}{$y$} \end{tikzpicture} \end{tzcode} \begin{tzcode}{.3} % \tzaxes: shift \begin{tikzpicture}[scale=.5] \tzhelplines(-1,-1)(7,7) \tzshoworigin* \tzaxes[thick,blue]<1,2>(7,7){$x$}{$y$} %% \tzaxes[-,dashed](7,7){$X$}[below]{$Y$}[left] \tzaxes<6,1>(6,1)(3,6){$a$}[left]{$b$} %% \end{tikzpicture} \end{tzcode} \paragraph{name path} With the option |""|, you can name the path of |\tzaxes| (by default, |axes|). This makes it easy to find \xem{x-intercepts} and \xem{y-intercepts} of a graph. \begin{tzcode}{.3} % tzaxes; name path=axes (by default) \begin{tikzpicture} \tzhelplines(-1,-1)(3,3) \tzaxes(-1,-1)(3,3){$x$}{$y$} \tzline"line"(-1,2)(3,-.5) \tzXpoint{axes}{line}(K) % default: axes \tzdot*(K) \tzdot(K-2) \end{tikzpicture} \end{tzcode} The x-intercepts are found first and then the y-intercepts are found, as in the following example. \begin{tzcode}{.3} \begin{tikzpicture}[scale=.7] % \tzaxes: name path \tzhelplines(-2,-2)(5,5) \tzaxes"myaxes"(-2,-2)(5,5) % name path = myaxes \tzparabola"curve"(-2,-2)(1,4)(5,-1) \tzXpoint{myaxes}{curve}(K) %% \tzdot*(K){$A$} \tzdot(K-2){$B$} \tzdot(K-3){$C$} \end{tikzpicture} \end{tzcode} \subsection{\protect\cmd{\tzaxes*}} \label{ss:tzaxes*} The starred version \icmd{\tzaxes*} sets the current state to a \iisw{bounding box} when the macro |\tzaxes| execution is complete. It is recommended for you to use |\tzaxes*| as the first graphics command in |tikzpicture| environment or before any larger graphics. \begin{tzcode}{.3} \begin{tikzpicture}[scale=.5] \tzaxes*(8,5){$x$}{$f(x)$} % bounding box \tzhelplines(-2,-1)(10,8) \tzto[out=90,in=-135,dashed](-2,8)(12,-2) \tzbezier[blue](-1,-1)(3,-2)(7,12)(10,10) \end{tikzpicture} \end{tzcode} %%------------------------------------------------------------ \section{\protect\cmd{\tzaxisx} and \protect\cmd{\tzaxisy}} \label{s:tzaxisx} \icmd{\tzaxisx} draws only the $x$ axis. \begin{tzdef} % syntax \tzaxisx[]""{}{} {}[] % defaults [->]<0>"axisx"{}{}{}[right] % arguments: [#1]: line style, arrow type (for x-axis) <#2>: y-shift of x-axis "#3": name path = #3 %% default: axisx {#4}: x-axis starts from %% {#5}: x-axis runs to %% {#6}: x-axis label [#7]: x-axis label option %% node option \end{tzdef} \icmd{\tzaxisy} draws only the $y$ axis. \begin{tzdef} % syntax \tzaxisx[]""{}{} {}[] % defaults [->]<0>"axisy"{}{}{}[right] % arguments: [#1]: line style, arrow type (for y-axis) <#2>: x-shift of y axis "#3": name path = #3 %% default: axisy {#4}: y-axis starts from %% {#5}: y-axis runs to %% {#6}: y-axis label [#7]: y-axis label option %% node option \end{tzdef} \begin{tzcode}{.3} % \tzaxisx, \tzaxisy \begin{tikzpicture}[scale=.5] \tzshoworigin \tzhelplines(5,5) \tzaxisx[blue]{-1}{5}{$xx$} \tzaxisy[red] {-1}{5}{$yy$}[green] \end{tikzpicture} \end{tzcode} \begin{tzcode}{.3} % \tzaxisx, \tzaxisy: shift \begin{tikzpicture}[scale=.5] \tzhelplines(7,7) \tzshoworigin \tzaxisx{-1}{7}{$xx$}[very near end,below] \tzaxisy{-1}{7}{$yy$}[midway,sloped,auto] \tzaxisx[-,dashed,red]<2>{-1}{7}{$xx'$}[blue] \tzaxisy[-,dashed,blue]<3>{-1}{7}{$yy'$} \end{tikzpicture} \end{tzcode} With the option |""|, you can name each path of |\tzaxisx| and |\tzaxisy| (by default, |axisx| and |axisy|, respectively). \begin{tzcode}{.3} % name path = axisx, axisy (defaults) \begin{tikzpicture}[scale=.5] \tzhelplines(7,7) \tzshoworigin \tzaxisx{-1}{7}{$xx$}[near start,below] \tzaxisy{-1}{7}{$yy$}[midway,sloped,auto] %\tzaxisx[-,dashed,red]<2>{-1}{7}{$xx'$}[blue] %\tzaxisy[-,dashed,blue]<3>{-1}{7}{$yy'$} \tzLFn"line"(1,3)(5,0)[-1:6] \tzXpoint*{line}{axisx}(A){$A$} \tzXpoint*{line}{axisy}(B){$B$}[0] \end{tikzpicture} \end{tzcode} \begin{tzcode}{.3} % name path = axisx, axisy (defaults) \begin{tikzpicture}[scale=.5] \tzhelplines(7,7) \tzshoworigin \tzaxisx{-1}{7}{$xx$}[near start,below] \tzaxisy{-1}{7}{$yy$}[midway,sloped,auto] \tzaxisx[-,dashed,red]<2>{-1}{7}{$xx'$}[blue] \tzaxisy[-,dashed,blue]<3>{-1}{7}{$yy'$} \tzLFn"line"(1,3)(5,0)[-1:6] \tzXpoint*{line}{axisx}(A){$A$} \tzXpoint*{line}{axisy}(B){$B$}[0] \end{tikzpicture} \end{tzcode} %%------------------------------------------------------------ \section{Display the origin} \label{s:tzshoworigin} \subsection{\protect\cmd{\tzshoworigin}} \label{ss:tzshoworigin} \icmd{\tzshoworigin} prints `0' (approximately) at the bottom left of the origin |(0,0)|, by default. \begin{tzdef} % syntax \tzshoworigin(){}[] % default <>(0,0){0}[below left,text height=1.25ex,text depth=.25ex] \end{tzdef} All arguments of |\tzshoworigin| are optional. \begin{tzcode}{.3} % \tzshoworigin \begin{tikzpicture}[scale=.45] \tzhelplines(8,5) \tzshoworigin \tzaxes(8,5) \end{tikzpicture} \end{tzcode} You can change the text by specifying the curly brace option |{}|, like, for example, |\tzshoworigin{$O$}|. You can also change the coordinate of origin by the option |()|. Specifying the option || also moves the origin. \begin{tzcode}{.3} % \tzshoworigin: shift \begin{tikzpicture}[scale=.45] \tzhelplines(-2,-1)(8,6) \tzshoworigin{$O_1$} %% \tzaxes(8,6){$x$}{$y$} \tzshoworigin<2,1>{$O_2$}[red] %% \tzaxes[dashed]<2,1>(8,6) \end{tikzpicture} \end{tzcode} \subsection{\protect\cmd{\tzshoworigin*}} \label{ss:tzshoworigin*} \icmd{\tzshoworigin*} prints a node dot at the origin with no text by default. Internally the dot is processed by |\tzdot*|. All arguments are optional. \begin{tzdef} % syntax \tzshoworigin*[](){}[]() % default *[]<>(0,0){}[below left,text height=1.25ex,text depth=.25ex](2.4pt) \end{tzdef} \begin{tzcode}{.3} % \tzshoworigin* \begin{tikzpicture}[scale=.45] \tzhelplines(-2,-1)(6,4) \tzshoworigin* \tzaxes(-2,-1)(6,4) \end{tikzpicture} \end{tzcode} You can add text with the option |{}|. The default size of the dot is |2.4pt|, and it can be changed with the last option |()|. You can change the dot style using the first optional argument |[]|. You can also move the dot by specifying the option ||. \begin{tzcode}{.3} % \tzshoworigin* \begin{tikzpicture}[scale=.5] \tzhelplines(-1,-1)(7,7) \tzshoworigin*[blue]{$o_1$}[red](5pt) \tzaxes(-1,-1)(7,7){$x$}{$y$} \tzaxes<6,4>(6,4)(1,1){$x'$}[left]{$y'$}[below] \tzshoworigin*[fill=none]<6,4>{$O'$}[blue,ar](3pt) \end{tikzpicture} \end{tzcode} \remark For |\tzshoworigin*|, text for the origin and the dot are placed independently. In other words, the position of node text does not depend on the size of a node dot. (In fact, the node text for the origin should look good with the `ticks labels', so it was not designed as a |label| for the node dot. This also means that the origin text cannot be positioned by an ||.) \begin{tzcode}{.3} % \tzshoworigin* (with tick labels) \begin{tikzpicture}[scale=.5] \tzhelplines(-2,1)(6,5) \tzshoworigin*{0}(5pt) \tzaxes(-2,-1)(6,5){$x$}{$y$} \tzticks{1,...,5}{1,...,4} \end{tikzpicture} \end{tzcode} %%------------------------------------------------------------ \section{\protect\cmd{\tzaxesL(')}: L-type axes} \label{s:tzaxesL} \icmd{\tzaxesL} is similar to |\tzaxes|, but it draws only the `L' type axes with |()| as the origin and |()| as the opposite corner of the rectangle. Those two coordinates are mandatory. \begin{tzdef} % syntax \tzaxesL[]""()() {}[]{}[] % defaults []<>"axesL"()(){}[right]{}[above] % arguments: [#1]: line style, arrow type <#2>: shift coordinate "#3": name path=#3 %% default: axesL (#4): (x1,y1) %% mandatory (#5): (x2,y2) %% mandatory {#6}: x-axis label [#7]: x-axis label option %% node option {#8}: y-axis label [#9]: y-axis label option %% node option \end{tzdef} The \iisw{swap version} \icmd{\tzaxesL'} swaps |()| and |()|. That is, |\tzaxesL'(A)(B)| is equivalent to |\tzaxesL(B)(A)|. \begin{tzcode}{.3} % \tzaxesL, \tzaxesL' \begin{tikzpicture}[scale=.5] \tzhelplines(8,7) \tzshoworigin \tzaxes(8,7){$x$}{$y$} \tzaxesL[red,thick](2,2)(6,5){$a$}{$b$} \tzaxesL'[blue,dashed,->](2,2)(6,5){$c$}{$d$} \tzaxesL'[->](7,1)(4,7){m}[draw,r]{n}[draw,circle] \end{tikzpicture} \end{tzcode} \paragraph{Shift} The option || moves the whole L-type axes. The empty option |<>| is not allowed. \begin{tzcode}{.3} % \tzaxesL, \tzaxesL': shift \begin{tikzpicture}[scale=.5] \tzhelplines(8,7) \tzshoworigin \tzaxes(8,7){$x$}{$y$} \tzaxesL[red,thick](2,2)(6,5){$a$}{$b$} \tzaxesL[red,thick]<.5,.5>(2,2)(6,5){$a'$}{$b'$} \tzaxesL'[blue,dashed,->](2,2)(6,5){$c$}{$d$} \tzaxesL'[blue,dashed,->]<-1,-1>(2,2)(6,5){$c'$}{$d'$} \end{tikzpicture} \end{tzcode} \paragraph{\texttt{name path}} With the option |""|, you can name the path of |\tzaxesL| (by default, |axesL|). This makes it easy to find the intercepts. \begin{tzcode}{.3} % \tzaxesL: name path (by default, axesL) \begin{tikzpicture}[scale=.5] \tzhelplines(8,7) \tzshoworigin \tzaxes(8,7){$x$}{$y$} \tzaxesL[red,thick](2,2)(6,5){$a$}{$b$} \tzaxesL'[blue,dashed,->]<-1,-1>(2,2)(6,5){$c'$}{$d'$} \tzparabola"curve"(1,6)(3,1.5)(6,5) \tzXpoint{axesL}{curve}(K) % default: axesL \tzdot*(K) \tzdot(K-2) \end{tikzpicture} \end{tzcode} %%================================== \chapter{Ticks} \label{c:ticks} %%------------------------------------------------------------ \section{\protect\cmd{\tzticks}: Tick labels} \label{s:tzticks} By default, \icmd{\tzticks} prints tick labels and draws zero length tick marks, i.e. from |(0pt)| to |(0pt)|. \begin{tzdef} % syntax: minimal \tzticks{}{} % syntax: medium \tzticks(){}[] (){}[] % syntax: full \tzticks[] (){}[] (){}[] % defaults []<0,0>(0pt:0pt){}[text height=1.25ex,text depth=.25ex,below](0pt:0pt){}[left] \end{tzdef} \paragraph{Tick labels} Internally, |\tzticks| uses \Tikz's |foreach| operation. So you need to provide comma separated lists to print tick labels. If only one comma separated list is specified, it is for $x$ tick labels. \begin{tzcode}{.3} % \tzticks \begin{tikzpicture}[scale=.4,font=\scriptsize] \tzhelplines(10,10) \tzaxes(-1,-1)(10,10) \tzticks[blue]{1,...,8}{2,...,7} \end{tikzpicture} \end{tzcode} You can change the numbered labels to a different format with slashes and other text, as follows: |/|. \begin{tzcode}{.3} % \tzticks: tick labels \begin{tikzpicture}[scale=.4,font=\scriptsize] \tzhelplines(10,10) \tzaxes(-1,-1)(10,10) \tzticks{1/$x_1$,2,5/$x_2$,8/y}[blue] {2/$\sqrt{x}$,3/y,4/m,5,7/$k$}[red] \end{tikzpicture} \end{tzcode} \paragraph{Tick marks} By specifying the options |()| for $x$ ticks and/or |()| for $y$ ticks, you can print tick marks. (The default is |(0pt:0pt)| for both options.) \begin{tzcode}{.3} % \tzticks: tick marks with () \begin{tikzpicture}[scale=.4,font=\scriptsize] \tzhelplines(10,10) \tzshoworigin \tzaxes(-1,-1)(10,10) \tzticks[draw=red,thick] (-15pt:10pt){1,...,5,6/$k$,7/$\alpha$,8/$\beta$} (0pt:3cm) {2,...,6,7/$\gamma$} \end{tikzpicture} \end{tzcode} The position of tick labels does not depend on the length of the tick marks. You can change the position of tick labels using |[]|. \begin{tzcode}{.3} % \tzticks: position of tick labels \begin{tikzpicture}[scale=.4,font=\scriptsize] \tzhelplines(10,10) \tzshoworigin \tzaxes(-1,-1)(10,10) \tzticks[draw=red,thick] (-15pt:10pt){1,...,6,7/$t$,8/$\alpha$}[b=5pt] (0pt:3cm) {2,...,6,7/$\beta$} \end{tikzpicture} \end{tzcode} \paragraph{Shift} You can move (or shift) the tick marks and labels together by specifying the optional argument ||, where || is for |y-ticks| and || is for |x-ticks|. \begin{tzcode}{.3} % \tzticks: shift \begin{tikzpicture}[scale=.4,font=\scriptsize] \tzhelplines(10,10) \tzshoworigin \tzaxes(-1,-1)(10,10) \tzaxes[dashed]<4,2>(-1,-1)(10,10) \tzticks[draw=red]<4,2> (-5pt:10pt){5,...,8} (0pt:3cm) {3,...,7} \end{tikzpicture} \end{tzcode} %%------------------------------------------------------------ \section{\protect\cmd{\tzticks*}: Tick marks} \label{s:tzticks*} The starred version \icmd{\tzticks*} always ignores all tick labels and draws tick marks from |0pt| to |3pt|, by default. \begin{tzdef} % syntax: minimal \tzticks*{}{} % syntax: medium \tzticks*(){}(){} % syntax: full \tzticks*[] (){}(){} % defaults []<0,0>(0pt:3pt){}(0pt:3pt){} % starred(*) version always suppresses tick labels \end{tzdef} \begin{tzcode}{.3} % \tzticks* \begin{tikzpicture}[scale=.4,font=\scriptsize] \tzhelplines(10,10) \tzshoworigin \tzaxes(-1,-1)(10,10) \tzticks*[draw=red,thick] {1,...,7,8/$\alpha$} % labels ignored (0pt:3cm){2,...,6,7/$\beta$} % labels ignored \end{tikzpicture} \end{tzcode} \begin{tzcode}{.4} % \tzticks(*) \begin{tikzpicture}[scale=.5] \tzhelplines(10,8) \tzaxes(-1,-1)(10,8) \tzticks* {0,0.2,...,8} {0,0.2,...,7} % default (0pt:3pt) \tzticks* (0pt:10pt){1,...,8} (0pt:10pt){1,...,7} \tzticks {1,...,8} {2,...,7} % default (0pt:0pt) \end{tikzpicture} \end{tzcode} %%------------------------------------------------------------ \section{\protect\cmd{\tzticksx(*)} and \protect\cmd{\tzticksy(*)}} \label{s:tzticksx} You can handle $x$ ticks and $y$ ticks independently. \paragraph{X ticks} \icmd{\tzticksx} only prints x-tick labels but not tick marks, by default. To prints tick marks you need to specify |(:)|. \begin{tzdef} % syntax: \tzticksx[](:){}[] % defaults []<>(0pt:0pt){}[text height=1.25ex,text depth=.25ex,below] \end{tzdef} \icmd{\tzticksx*} only prints x-tick marks from |0pt| to |3pt|, by default, suppressing tick labels. \begin{tzdef} % syntax: \tzticksx*[](:){} % defaults *[]<>(0pt:3pt){} % starred(*) version always suppresses tick labels \end{tzdef} \paragraph{Y ticks} \icmd{\tzticksy} only prints y-tick labels but not tick marks, by default. To prints tick marks you need to specify |(:)|. \icmd{\tzticksy*} only prints y-ticks from |0pt| to |3pt| by default, suppressing tick labels. \begin{tzdef} % syntax: \tzticksy[](){}[] % defaults []<>(0pt:0pt){}[] \end{tzdef} \begin{tzdef} % syntax: \tzticksy*[](){} % defaults []<>(0pt:0pt){} % starred(*) version suppresses tick labels \end{tzdef} \begin{tzcode}{.3} % \tztickx(*), \tzticky(*) \begin{tikzpicture}[scale=.4,font=\scriptsize] \tzhelplines(10,10) \tzshoworigin \tzaxes(-1,-1)(10,10) \tzticksx [draw=red,thick] (-5pt:1cm){1,...,7,8/$\alpha$} \tzticksy*[draw=blue,thick] (0pt:3cm){2,...,6,7/$\beta$} % labels ignored \end{tikzpicture} \end{tzcode} \paragraph{Shift} The options || and || move x-ticks and y-ticks, respectively. \begin{tzcode}{.3} % \tztickx(*), \tzticky(*): shift \begin{tikzpicture}[scale=.4,font=\scriptsize] \tzhelplines(10,10) \tzshoworigin \tzaxes(-1,-1)(10,10) \tzaxes[dashed]<2,1>(-1,-1)(10,10) \tzticksx*[draw=red,thick] <1>(-5pt:10pt){1,...,7,8/$\alpha$} % labels ignored \tzticksy [draw=blue,thick] <2>(0pt:3cm){2,...,6,7/$\beta$} \end{tikzpicture} \end{tzcode} %%================================== \chapter{Projections} \label{c:projections} %%------------------------------------------------------------ \section{\protect\cmd{\tzproj(*)}: Projections on the axes} \label{s:tzproj} \icmd{\tzproj} accepts a mandatory coordinate and draws perpendicular lines onto each axis from the coordinate. The lines are |dotted|, by default. \begin{tzdef} % syntax: minimum \tzproj() % syntax: medium \tzproj*(){}[]{}[] % syntax: full \tzproj*[]() {}[]{}[]() % defaults *[dotted]<0,0>(){}[text height=1.25ex,text depth=.25ex,below]{}[left](2.4pt) \end{tzdef} \icmd{\tzproj*} additionally prints a `black node dot' of the size |2.4pt|, by default. Internally, the node dot is processed by |\tzdot*|. The first option |[]| does not control the node dot. \paragraph{Dot size} You can only control the size of dots by the last optional argument |()| or by the \threeways\ on page \pageref{ss:threeways}. If you want to control |fill| or |color| of dots, use |\tzdot*| separately. \begin{tzcode}{.3} %\tzproj(*) \begin{tikzpicture}[scale=.5] \tzaxes(8,6) \tzproj[dashed,blue](2,3) \tzcoors(30:7)(A)(50:6)(B); \tzproj*(A) \tzproj*[dashed,text=blue](B)(5pt) \end{tikzpicture} \end{tzcode} \paragraph{Adding text} You can also add text around the projection point on each axis by the option |{}|. The position and color of the text is controlled by the option |[]|. The default position is (approximately) |[below]| for the x axis and |[left]| for the y axis. \begin{tzcode}{.3} % \tzproj(*): adding text \begin{tikzpicture}[scale=.5] \tzhelplines(8,6) \tzaxes(8,6) \tzproj[dashed,blue](2,3){$x$}{$y$} \tzcoors(30:7)(A)(50:6)(B); \tzproj*[text=blue](A){$a_1$}{$a_2$} \tzproj*[dashed](B){$x^*$}[green]{$y^*$}[red] \end{tikzpicture} \end{tzcode} \paragraph{Projection shift} Specifying the option || moves the projection point and text on each axis. \begin{tzcode}{.3} % \tzproj(*): projection shift \begin{tikzpicture}[scale=.5] \tzhelplines(8,6) \tzaxes(8,6) \tzproj[dashed,blue](2,3){$x$}{$y$} \tzcoors(30:7)(A)(50:6)(B); \tzaxes[blue]<3,1>(8,6) \tzproj*[dashed,text=blue]<3,1>(A){$a_1$}{$a_2$} %% \end{tikzpicture} \end{tzcode} %%------------------------------------------------------------ \section{\protect\cmd{\tzprojx(*)} and \protect\cmd{\tzprojy(*)}} \label{s:tzprojx} \icmd{\tzprojx} draws a dotted line, which is perpendicular to the x axis. \icmd{\tzprojx*} additionally prints a `black node dot' of the size |2.4pt|, by default. \begin{tzdef} % syntax: \tzprojx[](){}[]() % defaults []<0,0>(){}[text height=1.25ex,text depth=.25ex,below](2.4pt) \end{tzdef} \icmd{\tzprojy} draws a dotted line, which is perpendicular to the y axis. \icmd{\tzprojy*} additionally prints a `black node dot' of the size |2.4pt|, by default. \begin{tzdef} % syntax: \tzprojy[](){}[]() % defaults []<0,0>(){}[left](2.4pt) \end{tzdef} You can only control the size of dots by the last option |()|. If you want to control |fill| or |color| of dots, use |\tzdot*| separately. You can also add text around the projection point on each axis by specifying the option |{}| or |{}| followed by the option |[]|. \begin{tzcode}{.3} % \tzprojx(*), \tzprojy(*) \begin{tikzpicture}[scale=.5,font=\scriptsize] \tzhelplines(-1,-2)(6,6) \tzshoworigin \tzaxes(-1,-1)(6,6) \tzproj*[dashed](4,5){4}{5}(3pt) \tzprojx*[green,thick,solid](3,4){$x=3$}[blue] \tzprojy*[thick](5,2){2}(5pt) \end{tikzpicture} \end{tzcode} Specifying the option || with |\tzprojx(*)| and |\tzprojy(*)| moves the projection point and text accordingly. \begin{tzcode}{.3} % \tzprojx(*), \tzprojy(*): shift \begin{tikzpicture}[scale=.5,font=\scriptsize] \tzhelplines(-1,-2)(6,6) \tzshoworigin \tzaxes(-1,-1)(6,6) \tzaxes[blue]<2,1>(-1,-1)(6,6) \tzprojx*[green,thick,solid]<2,1>(3,4){$x=3$}[blue] \tzprojy*[thick]<2,1>(5,2){2}(5pt) \end{tikzpicture} \end{tzcode} %%------------------------------------------------------------ \section{\protect\cmd{\tzprojs(*)}: Semicolon versions} \label{s:tzprojs} \icmd{\tzprojs} accepts any number of coordinates and draws perpendicular lines onto each axis from the coordinates. The lines are |dotted|, by default. |\tzprojs| is a semicolon version of |\tzproj|, so a semicolon is needed to indicate when the coordinate iteration ends. Its repeating pattern is |(){}[]{}[]|. \begin{tzdef} % syntax: minimum \tzprojs()() ..repeated.. () ; % syntax: medium \tzprojs*(){}[]{}[] ..repeated.. (){}[]{}[] % syntax: full \tzprojs*[] (){}[]{}[] ..repeated.. (){}[]{}[] ; () % defaults *[dotted]<0,0> (){}[text height=1.25ex,text depth=.25ex,below]{}[left] ..repeated..(){}[]{}[];(2.4pt) \end{tzdef} \icmd{\tzprojs*} additionally prints |\tzdots*| of the |2.4pt| (by default) on the coordinates. The first option |[]| does not control the node dots. \begin{tzcode}{.3} % \tzprojs(*): adding text \begin{tikzpicture}[scale=.5] \tzhelplines(8,6) \tzaxes(8,6) \tzcoors(30:7)(A)(50:6)(B); \tzprojs*[dashed,text=blue] (2,3){$x$}{$y$} (A){$a_1$}{$a_2$} (B){$x^*$}[green]{$y^*$}[red]; \end{tikzpicture} \end{tzcode} You can move the projection points and text accordingly, using the option || before the first coordinate. The \xem{empty} shift option |<>| is \xem{not allowed}. You can also change the dot size with the last option |()| \xem{after} the semicolon, as in |\tzproj(*)|. \begin{tzcode}{.3} % \tzprojs(*): shift and dot size \begin{tikzpicture}[scale=.5] \tzhelplines(8,6) \tzaxes(8,6) \tzaxes[blue]<1,1>(8,6) \tzcoors(30:7)(A)(50:6)(B); \tzprojs*[dashed,text=blue]<1,1> %% (2,3){$x$}{$y$} (A){$a_1$}{$a_2$} (B){$x^*$}[green]{$y^*$}[red];(4pt) %% \end{tikzpicture} \end{tzcode} %%------------------------------------------------------------ \section{\protect\cmd{\tzprojsx(*)} and \protect\cmd{\tzprojsy(*)}: Semicolon versions} \label{s:tzprojsx} \icmd{\tzprojsx} is a semicolon versions of |\tzprojx|. It draws dotted lines, which are perpendicular to the x axis from the specified coordinates, by default. \icmd{\tzprojsx*} additionally prints |\tzdots*| of the size |2.4pt|, by default. \begin{tzdef} % syntax: \tzprojsx*[] (){}[]..repeated..(){}[];() % defaults *[]<0,0> (){}[text height=1.25ex,text depth=.25ex,below] ..repeated..(){}[];(2.4pt) \end{tzdef} \icmd{\tzprojsy} and \icmd{\tzprojsy*} work simililarly as |\tzprojsx| and |\tzprojsx*| do but to the y axis. \begin{tzdef} % syntax: \tzprojsy*[] (){}[]..repeated..(){}[];() % defaults []<0,0> (){}[left]..repeated..(){}[];(2.4pt) \end{tzdef} \begin{tzcode}{.3} % \tzprojsx(*), \tzprojsy(*) \begin{tikzpicture}[scale=.5,font=\scriptsize] \tzhelplines(-1,-2)(6,6) \tzshoworigin \tzaxes(-1,-1)(6,6) \tzprojsx*[thick] (4,5){4} (3,4){$x=3$}[blue] (5,2){2};(5pt) \end{tikzpicture} \end{tzcode} Specifying the option || moves the projection points and text accordingly. \begin{tzcode}{.3} % \tzprojsx(*), \tzprojsy(*): shift \begin{tikzpicture}[scale=.5,font=\scriptsize] \tzhelplines(-1,-2)(6,6) \tzshoworigin \tzaxes(-1,-1)(6,6) \tzaxes[blue]<2,1>(-1,-1)(6,6) \tzprojsy*[red,solid]<2,1> (3,4){$x=3$}[blue] (5,2){2}; \end{tikzpicture} \end{tzcode} %%================================== \chapter{Plot Functions} \label{c:functions} %%------------------------------------------------------------ \section{\protect\cmd{\tzfn} and \protect\cmd{\tzfn'}: Plot functions and inverse functions} \label{s:tzfn} \subsection{\protect\cmd{\tzfn}} \label{ss:tzfn} \icmd{\tzfn} plots a function of |\x|. \begin{tzdef} % syntax: minimum \tzfn{}[] % syntax: medium \tzfn{}[]{}[] % syntax: full \tzfn[]"" {}[]{}[] % [] should be of the form [] % defaults [samples=201]<>""{}[]{}[]<> \end{tzdef} |\tzfn| takes two mandatory arguments: |{}| and |[]|. The domain should be of the form |[]|, like |[1:5]|. \begin{tztikz} \tzfn{.5*(\x)^2-1}[1:5] % works like: \draw [samples=201,domain=1:5] plot (\x,{.5*(\x)^2-1}); \end{tztikz} \begin{tzcode}{.3} % \tzfn : simple example \begin{tikzpicture}[scale=.5] \tzhelplines(-2,-2)(5,5) \tzaxes*(-2,-2)(5,5) \tzfn{.5*(\x)^2-1}[0:3.5] \end{tikzpicture} \end{tzcode} %%------------------------------------------------------------ \subsection{Inverse functions: \protect\cmd{\tzfn'}} \label{ss:tzfn'} The \iisw{swap version} \icmd{\tzfn'} draws the \iisw{inverse function} of |\tzfn|. \begin{tztikz} \tzfn'{.5*(\x)^2-1}[1:5] % works like: \draw [samples=201,domain=1:5] plot ({.5*(\x)^2-1},\x); \end{tztikz} \begin{tzcode}{.3} % \tzfn' : inverse function (with text) \begin{tikzpicture}[scale=.5] \tzhelplines(-2,-2)(5,5) \tzaxes*(-2,-2)(5,5) \tzfn{.5*(\x)^2-1}[0:3.5] \tzfn'[red]{.5*(\x)^2-1}[0:3.5]{inversed}[r] %% \end{tikzpicture} \end{tzcode} You can add text at the end of the graph, by specifying |{}| and |[]| immediately after the domain. \begin{tzcode}{.3} % \tzfn(') \begin{tikzpicture}[scale=.5] \tzhelplines(8,8) \tzaxes(8,8){$Q$}{$P$} \tzfn{5-5/7*\x}[0:7]{demand}[a=5mm] \tzfn'[blue]{5-5/7*\x}[0:7] {inverse\\demand}[r=5mm,align=center] \tzticks{5,7}{5,7} \end{tikzpicture} \end{tzcode} \subsection{Define and name functions} To use |\tzfn| you need to express a function as a function of |\x|. \begin{tzcode}{.3} % \tzfn \begin{tikzpicture}[scale=.5] \tzhelplines(8,8) \tzaxes(8,8) \def\Dx{7-\x} % define \tzfn{\Dx}[0:7]{$D$}[ar] \tzfn{1+\x}[0:7]{$S$}[blue,r] \end{tikzpicture} \end{tzcode} You can also use the predefined functions of \Tikz\ such as |sin|, |cos|, |ln|, |log10|, |log2|, |exp|, |sqrt|, and so on. (See \Tikz\ manual.) \begin{tzcode}{.3} % \tzfn \begin{tikzpicture}[scale=.5] \tzhelplines(-2,-2)(8,6) \tzaxes*(-2,-2)(8,6) \def\Fx{sin(\x r)+3} \def\Gx{exp(\x)} \def\Hx{ln(\x)} \tzfn\Fx[-2:2*pi]{$\sin\,x+3$}[blue,r] \tzfn[blue]\Gx[-2:2]{$e^x$}[red,r] \tzfn[dashed]\Hx[.2:7]{$\ln\,x$}[r] \end{tikzpicture} \end{tzcode} \subsection{Name paths: \texttt{name path}} \label{ss:tzfn:namepath} You can name the path of |\tzfn| by specifying the option |""| \xem{immediately before} the mandatory argument |{}|. You can use the path names to find intersection points. \begin{tztikz} \tzfn"mypath"\Fx[1:5] % works like: \draw [samples=201,,domain=1:5,name path=mypath] plot (\x,{\Fx}); \end{tztikz} \remark Advantage of defining functions: Suppose that the function's expression || consists \xem{only of a macro name}, say, |\Fx|. Then \begin{itemize}\firmlist \item The macro name |Fx| (\xem{without the backslash}) is \xem{automatically assigned} to ||, unless you give another name. \item That is, |\tzfn\Fx| is equivalent to |\tzfn"Fx"\Fx|. (\xem{You don't need to type the same thing twice}.) \end{itemize} \begin{tztikz} \tzfn\Fx[1:5] % works like: \draw [samples=201,domain=1:5,name path=Fx] plot (\x,{\Fx}); \end{tztikz} \begin{tzcode}{.3} % \tzfn: name path: intersection point \begin{tikzpicture}[scale=.5] \tzhelplines(8,8) \tzaxes(8,8) \def\Dx{7-\x} \def\Sx{1+\x} \tzfn"Dx"\Dx[0:7]{$D$}[ar] % name path = Dx \tzfn \Sx[0:7]{$S$}[blue,r] % name path = Sx \tzXpoint*{Dx}{Sx}(E){E} % intersection \end{tikzpicture} \end{tzcode} \subsection{Move graphs: \texttt{shift}} You can move the graph of |\tzfn| by specifying the option || \xem{before} the mandatory argument |{}| or \xem{immediately before} the option |""|, if it exists. The \xem{empty} shift option |<>| is \xem{not allowed}. \begin{tzcode}{.3} % \tzfn: shift \begin{tikzpicture}[scale=.6] \tzhelplines(8,8) \def\Dx{7-\x} \def\Sx{1+\x} \tzfn \Dx[0:7]{$D$}[right] % name path = Dx \tzfn"supply"\Sx[0:7]{$S$}[right] % name path = supply \tzXpoint*{Dx}{supply}(E){$E$} \tzfn[dashed]<1,1>"demandA"\Dx[0:7]{$D'$}[r] \tzfn[dashed]<1,-1>"supplyA"\Sx[0:7]{$S'$}[r] \tzXpoint*{demandA}{supplyA}(E1){$E'$} \end{tikzpicture} \end{tzcode} \subsection{Extend paths: \texttt{}, \protect\cmd{\tzfnAtBegin}, \protect\cmd{\tzfnAtEnd}} \label{ss:tzfn:atbegin} \paragraph{\texttt{}} You can extend the path of |\tzfn|, by writing \Tikz\ code in the \xem{last optional argument} ||. Internally it adds the \Tikz\ code to the path \xem{after} the options |{}| and |[]|. \begin{tzcode}{.3} % \tzfn: \begin{tikzpicture}[scale=.5] \tzhelplines(-2,-2)(8,6) \tzaxes*(-2,-2)(8,6) \def\Fx{sin(\x r)+3} \tzfn[->]\Fx[-2:2*pi]{$\sin\,x+3$}[blue,r] < to [bend right] ++(2,-2) node [b] {End!} > \end{tikzpicture} \end{tzcode} \paragraph{\texttt{\bs tzfnAtEnd}} You can also extend the path of |\tzfn| at the end using \icmd{\tzfnAtEnd}. Internally it adds \Tikz\ code immediately \xem{before} the options |{}| and |[]|. But you have to use |\tzfnAtEnd| (immediately) \xem{before each} |\tzfn|. \begin{tzcode}{.3} % \tzfnAtEnd (before \tzfn) \begin{tikzpicture}[scale=.5] \tzhelplines(-2,-2)(8,6) \tzaxes*(-2,-2)(8,6) \def\Fx{sin(\x r)+3} \tzfnAtEnd{to [bend right] ++(2,-2) node [b] {End!}} \tzfn[->]\Fx[-2:2*pi]{$\sin\,x+3$}[blue,r] \end{tikzpicture} \end{tzcode} Specifying the option || extends the path after |\tzfnEnd| if it exists. \begin{tzcode}{.3} % \tzfnAtEnd (before \tzfn) \begin{tikzpicture}[scale=.5] \tzhelplines(-2,-2)(8,6) \tzaxes*(-2,-2)(8,6) \def\Fx{sin(\x r)+3} \tzfnAtEnd{to [bend right] ++(2,-2) node [b] {End!}} \tzfn[->]\Fx[-2:2*pi]{$\sin\,x+3$}[blue,r] < arc (0:90:4cm) node [draw,red,left] {Here!!} > \end{tikzpicture} \end{tzcode} \paragraph{\texttt{\bs tzfnAtBegin}} You can use \icmd{\tzfnAtBegin} (immediately) \xem{before each} |\tzfn| to insert \Tikz\ code at the beginning of the path of |\tzfn|. \begin{tzcode}{.3} % \tzfnAtBegin (before \tzfn) \begin{tikzpicture}[scale=.5] \tzhelplines(-2,-2)(8,6) \tzaxes*(-2,-2)(8,6) \def\Fx{sin(\x r)+3} \tzfnAtBegin{ (1,1) -| } \tzfn[->]\Fx[-2:2*pi]{$\sin\,x+3$}[blue,r] \end{tikzpicture} \end{tzcode} \remark \begin{itemize}\firmlist \item |\tzfn| is based on the |plot| operation of \Tikz. \item Appending \Tikz\ code at the beginning of |\tzfn| may cause a problem when you use some operations (such as |to| or \verb+-|+ or \verb+|-+) that expect a coordinate to link. \item In the version 2 of the |tzplot| package, this issue is internally taken care of by using |(|\ixxw{current subpath start}|)|, which is a special coordinate pre-defined in \Tikz. (See \Tikz\ manual for more details.) \end{itemize} \section{\protect\cmd{\tzfnofy} and \protect\cmd{\tzfnofy'}: Functions of variable $y$} \label{ss:tzfnofy} \icmd{\tzfnofy} plots a function of |\y|. Define a function with the (predefined) variable |\y|. |\tzfnofy| works just like |\tzfn| but as a function of |\y|. \begin{tzdef} % syntax: minimum \tzfnofy{}[] % syntax: medium \tzfnofy{}[]{}[] % syntax: full \tzfnofy[]"" {}[]{}[] % [] should be of the form [] % defaults [samples=201]<>""{}[]{}[]<> \end{tzdef} \begin{tztikz} \tzfnofy{2*\y+1}[1:5] % works like: \draw [samples=201,domain=1:5,variable=\y] plot ({2*\y+1},\y); \end{tztikz} The \iisw{swap version} \icmd{\tzfnofy'} plots the \iisw{inverse function} of |\tzfnofy|. \begin{tztikz} \tzfnofy'{2*\y+1}[1:5] % works like: \draw [samples=201,domain=1:5,variable=\y] plot (\y,{2*\y+1}); \end{tztikz} \begin{tzcode}{.3} % \tzfnofy('): variable = \y \begin{tikzpicture}[scale=.5] \tzhelplines(8,8) \tzaxes(8,8){$x$}{$y$} \tzfnofy{5-5/7*\y}[0:7]{$f(y)$}[r=5mm] \tzfnofy'[blue]{5-5/7*\y}[0:7] {$f^{-1}(y)$}[a=5mm,align=center] \tzticks{5,7}{5,7} \end{tikzpicture} \end{tzcode} \begin{tzcode}{.3} % \tzfnofy: shift: intersections \begin{tikzpicture}[scale=.6] \tzhelplines(8,8) \def\Fy{7-\y} \def\Gy{1+\y} \tzfnofy\Fy[0:7]{$f(y)$}[right] % name path = Fy \tzfnofy\Gy[0:7]{$g(y)$}[right] % name path = Gy \tzXpoint*{Fy}{Gy}(E){$E$} \tzfnofy[dashed]<1,1>"Fyy"\Fy[0:7]{shifted}[r] \tzfnofy[dashed]<1,-1>"Gyy"\Gy[0:7]{shifted}[r] \tzXpoint*{Fyy}{Gyy}(E1){$E'$} \end{tikzpicture} \end{tzcode} You can also extend the path of |\tzfnofy| using the option || or the macros \icmd{\tzfnofyAtBegin} and \icmd{\tzfnofyAtEnd}. \begin{tzcode}{.3} % \tzfnofy: shift: intersections \begin{tikzpicture}[scale=.5] \tzhelplines(8,8) \def\Fy{7/\y} \tzfnofyAtBegin{(6,3) node [a] {Start} to[bend left]} \tzfnofyAtEnd{ -| ++(3,-1) } \tzfnofy[->]\Fy[1:7] < to[bend right] ++(3,2) node [draw,r] {End!} > \end{tikzpicture} \end{tzcode} %%%\section{\protect\cmd{\tzdeffn} and \protect\cmd{\tzdeffnofy}} %%%\label{ss:tzdeffn} %%% %%%\icmd{\tzdeffn} defines a functions of |\x|. %%% %%%\icmd{\tzdeffnofy} defines a function of |\y|. %%%%% %%%%%These are redundant, since one can use |\def|. %%%%% %%------------------------------------------------------------ \section{Horizontal lines} \label{s:tzhfn} \subsection{\protect\cmd{\tzhfnat}} \label{ss:tzhfnat} \icmd{\tzhfnat} draws a horizontal line at a specified value of $y$. \begin{tzdef} % syntax: minimal \tzhfnat{}[] % syntax: full \tzhfnat[]"" {}[]{}[] % defaults []<>""{}[west:east (of current bounding box)]{}[]<> \end{tzdef} |\tzhfnat| accepts only one mandatory argument |{}|. The domain is optional and should be of the form |[]|. The default domain is from left to right of the \ixxw{current bounding box}. \remark Internally, the default domain of |\tzhfnat| depends on the \ixxw{current bounding box}. \begin{itemize} \item Each |\tzhfnat| may draw a line with a (slightly) different length. \item If an appropriate |current bounding box| is not formed before |\tzhfnat| is executed, you will probably get an unexpected result. \item In that case, you can fix a |bounding box| in the beginning of the |tikzpicture| environment using macros such as \icmd{\tzbbox}, \icmd{\tzhelplines*}, \icmd{\tzaxes*}, or \Tikz's \icmd{\useasboundingbox}. \end{itemize} \begin{tzcode}{.3} % \tzhfnat \begin{tikzpicture} \tzhelplines(4,3) \tzhfnat[blue,thick]{0} \tzhfnat[red,thick]{1}[1:3]{line A}[r] \tzhfnat[blue]{2}{line B}[r] \tzhfnat[red]{3}[0:3]{line C}[draw=blue,red,r] \end{tikzpicture} \end{tzcode} You can name the path of |\tzhfnat| by the option |""|. You can move the line by the option ||. You can also extend the path from the end of the line by writing \Tikz\ code in the last optional argument ||. \begin{tzcode}{.3} % \tzhfnat: shift, \begin{tikzpicture} \tzhelplines*(4,4) % bounding box \tzfn"XX"{\x}[0:4] \tzhfnat[blue,thick]{0} \tzhfnat[red,thick]<-.5,.5>"AA"{1}[1:3]{line A'}[r] \tzXpoint*{AA}{XX} \tzhfnat[blue,->]{2}{line B}[r] < arc (0:120:1.5) node [b,draw] {End!} > \end{tikzpicture} \end{tzcode} You can also use \icmd{\tzhfnatAtBegin} and \icmd{\tzhfnatAtEnd} to extend the path of |\tzhfnat| at the beginning and at the end. Specifying the option || extends the path after |\tzhfnatAtEnd| if it exists. (See other examples of using |\tz<..>AtBegin| and |\tz<...>AtEnd|.) \subsection{\protect\cmd{\tzhfn}} \label{ss:tzhfn} \icmd{\tzhfn} accepts a coordinate as a mandatory argument and draws a horizontal line at the $y$ value of the coordinate. For example, |\tzhfn(,3)|, ignoring ||, is equivalent to |\tzhfnat{3}|. \xem{Everything else is the same as in} |\tzhfnat|. \begin{tzdef} % syntax: minimal \tzhfn()[] % syntax: full \tzhfn[]"" ()[]{}[] % defaults []<>""()[west:east (of current bounding box)]{}[]<> \end{tzdef} \begin{tzcode}{.3} % \tzhfn: shift, \begin{tikzpicture} \tzhelplines*(4,4) % bounding box \tzcoors(0,1)(A)(0,2)(B); \tzfn"XX"{\x}[0:4] \tzhfn[blue,thick](5,0) % x=5 ignored \tzhfn[red,thick]<-.5,.5>"AA"(A)[1:3]{line A'}[r] \tzXpoint*{AA}{XX} \tzhfn[blue,->](B){line B}[r] < arc (0:120:1.5) node [b,draw] {End!} > \end{tikzpicture} \end{tzcode} You can also use \icmd{\tzhfnAtBegin} and \icmd{\tzhfnAtEnd} to extend the path of |\tzhfn| at the beginning and at the end. Specifying the option || extends the path after |\tzhfnAtEnd| if it exists. (See other examples of using |\tz<..>AtBegin| and |\tz<...>AtEnd|.) %%------------------------------------------------------------ \section{Vertical lines} \label{s:tzvfn} \subsection{\protect\cmd{\tzvfnat}} \label{ss:tzvfnat} \icmd{\tzvfnat} draws a vertical line at a specified value of $x$. \begin{tzdef} % syntax: minimal \tzvfnat{}[] % syntax: full \tzvfnat[]"" {}[]{}[] % defaults []<>""{}[south:north (of current bounding box)]{}[]<> \end{tzdef} |\tzvfnat| accepts only one mandatory argument |{}|. The domain is optional and should be of the form |[]|. The default domain is from bottom to top of the \ixxw{current bounding box}. \begin{tzcode}{.3} % \tzvfnat \begin{tikzpicture} \tzhelplines(4,4) \tzvfnat[blue,thick]{0} \tzvfnat[red,thick]{1}[1:3]{line A}[a] \tzvfnat[blue]{2}{line B}[a] \tzvfnat[red]{3}[0:3]{line C}[draw=blue,red,a] \end{tikzpicture} \end{tzcode} You can name the path of |\tzvfnat| by the option |""|. You can move the line by the option ||. You can also extend the path from the end of the line by writing \Tikz\ code in the last optional argument ||. \begin{tzcode}{.3} % \tzvfnat: shift, \begin{tikzpicture} \tzhelplines*(4,4) % bounding box \tzfn"XX"{\x}[0:4] \tzvfnat[blue,thick]{0} \tzvfnat[red,thick]<.5,-.5>"AA"{1}[1:3]{line A'}[a] \tzXpoint*{AA}{XX} \tzvfnat[blue,->]{2}{line B}[a] < arc (90:-30:1.5) node [b,draw] {End!} > \end{tikzpicture} \end{tzcode} In the previous example, |\tzhelplines*| is used to fix a bounding box. (See Section \ref{s:tzhelplines} on page \pageref{s:tzhelplines}, for more details.) You can also use \icmd{\tzvfnatAtBegin} and \icmd{\tzvfnatAtEnd} to extend the path of |\tzvfnat| at the beginning and at the end. Specifying the option || extends the path after |\tzvfnatAtEnd| if it exists. (See other examples of using |\tz<..>AtBegin| and |\tz<...>AtEnd|.) \subsection{\protect\cmd{\tzvfn}} \label{ss:tzvfn} \icmd{\tzvfn} accepts a coordinate as a mandatory argument and draws a horizontal line at the $x$ value of the coordinate. For example, |\tzvfn(3,)|, ignoring ||, is equivalent to |\tzvfnat{3}|. \xem{Everything else is the same as in} |\tzvfnat|. \begin{tzdef} % syntax: minimal \tzvfn()[] % syntax: full \tzvfn[]"" ()[]{}[] % defaults []<>""()[south:north (of current bounding box)]{}[]<> \end{tzdef} \begin{tzcode}{.3} % \tzvfn: shift, \begin{tikzpicture} \tzhelplines*(4,4) % bounding box \tzcoors(1,0)(A)(2,0)(B); \tzfn"XX"{\x}[0:4] \tzvfn[blue,thick](0,5) % y=5 ignored \tzvfn[red,thick]<.5,-.5>"AA"(A)[1:3]{line A'}[a] \tzXpoint*{AA}{XX} \tzvfn[blue,->](B){line B}[a] < arc (90:-30:1.5) node [b,draw] {End!} > \end{tikzpicture} \end{tzcode} You can also use \icmd{\tzvfnAtBegin} and \icmd{\tzvfnAtEnd} to extend the path of |\tzvfn| at the beginning and at the end. Specifying the option || extends the path after |\tzvfnAtEnd| if it exists. (See other examples of using |\tz<..>AtBegin| and |\tz<...>AtEnd|.) %%================================== \chapter{Plot Linear Functions} \label{c:linearfunctions} %%------------------------------------------------------------ \section{\protect\cmd{\tzLFn}: Plot linear functions} \label{s:tzLFn} \subsection{\protect\cmd{\tzLFn} and \protect\cmd{\tzLFn'}} Knowing two coordinates or one coordinate with a slope, you can draw a linear function with the macro \icmd{\tzLFn}, \xem{without writing the explicit definition of a linear function}. \begin{itemize}%\firmlist \item |\tzLFn()()| is prepared for when you know two coordinates on a line. \begin{itemize} \item If you provide two points $(x_1,y_1)$ and $(x_2,y_2)$, |\tzLFnofy(x1,x2)(y1,y2)| draws the graph of $f(x)=\frac{y_2-y_1}{x_2-x_1}(x-x_1)+y_1$. \end{itemize} \item |\tzLFn(){}| is used when you know one coordinate and the slope of a line. \item If you specify all the three arguments |()(){}|, then the slope is ignored. \end{itemize} For example, |\tzLFn(1,1)(2,3)[0:4]| draws a line passing through two points: $(1,1)$ and $(2,3)$, over $0\leq x\leq 4$. |\tzLFn(1,1){.5}[0:4]| draws a line passing through a point $(1,1)$ with a slope |.5|, over $0\leq x\leq 4$. |\tzLFn| accepts two mandatory arguments: |()| and |[]|. \begin{itemize}%\firmlist \item The \xem{domain} should be of the form |[]|. \item If just one coordinate is specified without a slope, the slope is regarded as |1|, by default. \end{itemize} \begin{tzdef} % syntax: minimum \tzLFn()()[] % two coordinates \tzLFn(){)[] % one coordinate and slope % syntax: full \tzLFn[]"" ()(){}[]{}[] % defaults []<>""()(){1}[]{}[]<> \end{tzdef} You can add text at the end of the line of |\tzLFn| by the options |{}| and |[]|. You can also name the path of |\tzLFn| by specifying the option |""| \xem{immediately before} the mandatory coordinate. \begin{tzcode}{.3} % \tzLFn: two coordinates \begin{tikzpicture} \tzhelplines(4,3) \tzcoors*(1,1)(A)(1,2)(B)(3,1)(C); \tzLFn[blue]"Gx"(B)(C)[0:4]{$g(x)$}[r] \end{tikzpicture} \end{tzcode} \begin{tzcode}{.3} % \tzLFn: one coordinate and slope \begin{tikzpicture} \tzhelplines(4,3) \tzcoors*(1,1)(A)(1,2)(B)(3,1)(C); \tzLFn[red]"Fx"(A){.5}[0:4]{$f(x)$}[a] \end{tikzpicture} \end{tzcode} \remark If you inadvertently try an \xem{infinite slope}, you will get an \iisw{error message}. \paragraph{Inverse function} The \iisw{swap version} \icmd{\tzLFn'} draws the \iisw{inverse function} of |\tzLFn|. \begin{tzcode}{.3} % \tzLFn' : inverse function : intersection \begin{tikzpicture}[scale=.8] \tzhelplines(4,4) \tzcoors*(1,1)(A)(1,2)(B)(3,1)(C); \tzLFn'[red]"Fx"(A){.5}[0:4]{$f(x)$}[a] \tzLFn'[blue]"Gx"(B)(C)[0:4]{$g(x)$}[r] \tzXpoint*[fill=none]{Fx}{Gx}(E){$E$}(3pt) \end{tikzpicture} \end{tzcode} You can move the line of |\tzLFn| by specifying the option || immediately before the option |""|. (The \xem{empty} shift option |<>| is \xem{not allowed}.) You can also extend the path of |\tzLFn| by writing \Tikz\ code in the last optional argument ||. \begin{tzcode}{.3} % \tzLFn: shift, extending path \begin{tikzpicture}[scale=.8] \tzhelplines(4,4) \tzcoors*(1,1)(A)(1,2)(B)(3,1)(C); \tzLFn[blue]"Gx"(B)(C)[0:4]{$g(x)$}[r] \tzLFn[dashed,red,->]<1,1>"Gx"(B)(C)[0:4]{$g(x)$}[r] < arc (0:140:2) node [below] {End!} > \end{tikzpicture} \end{tzcode} \icmd{\tzLFnAtBegin} and \icmd{\tzLFnAtEnd} are available to extend a path of |\tzLFn| at the beginning and and the end, respectively. Specifying the option || extends the path after |\tzLFnAtEnd|, if it exist. \begin{tzcode}{.3} % \tzLFnAtBegin and \tzLFnAtEnd \begin{tikzpicture}[scale=.8] \tzhelplines*(4,4) \tzcoors*(1,1)(A)(1,2)(B)(3,1)(C); \tzLFn[blue]"Gx"(B)(C)[0:4]{$g(x)$}[r] \tzLFnAtBegin{(1,0) to [bend left] } \tzLFnAtEnd{ arc (0:140:2) } \tzLFn[dashed,red,->]<1,1>"Gx"(B)(C)[0:4]{$g(x)$}[r] \end{tikzpicture} \end{tzcode} \subsection{\protect\cmd{\tzLFnofy} and \protect\cmd{\tzLFnofy'}} \icmd{\tzLFnofy} draws a line as a function of |\y|. |\tzLFnofy| works just like |\tzLFn| but for the variable $y$. If you provide two points $(x_1,y_1)$ and $(x_2,y_2)$, |\tzLFnofy(x1,x2)(y1,y2)| draws the graph of $f(y)=\frac{x_2-x_1}{y_2-y_1}(y-y_1)+x_1$. Everything else is the same as |\tzLFn|. \begin{tzdef} % syntax: minimum \tzLFnofy()()[] \tzLFnofy(){)[] % syntax: full \tzLFnofy[]"" ()(){}[]{}[] % defaults []<>""()(){1}[]{}[]<> \end{tzdef} \begin{tzcode}{.3} % \tzLFnofy \begin{tikzpicture}[scale=.8] \tzhelplines(4,4) \tzcoors*(1,1)(A)(1,2)(B)(3,1)(C); \tzLFnofy[red]"Fx"(A){.5}[0:4]{$f(y)$}[a] \tzLFnofy[blue]"Gx"(B)(C)[.5:2.5]{$g(y)$}[a] \tzXpoint*[fill=none]{Fx}{Gx}(E){$E$}(3pt) \end{tikzpicture} \end{tzcode} \remark If you inadvertently try an \xem{infinite slope}, you will get an \xem{error message}. \paragraph{Inverse function} The \iisw{swap version} \icmd{\tzLFnofy'} draws the \iisw{inverse function} of |\tzLFnofy|. \begin{tzcode}{.3} % \tzLFnofy' \begin{tikzpicture}[scale=.8] \tzhelplines(4,4) \tzcoors*(1,1)(A)(1,2)(B)(3,1)(C); \tzLFnofy'[red]"Fx"(A){.5}[0:4]{$f(y)$}[a] \tzLFnofy'[blue]"Gx"(B)(C)[.5:2.5]{$g(y)$}[r] \tzXpoint*[fill=none]{Fx}{Gx}(E){$E$}(3pt) \end{tikzpicture} \end{tzcode} You can use \icmd{\tzLFnofyAtBegin} and \icmd{\tzLFnofyAtEnd} to extend the path of |\tzLFnofy| at the beginning and at the end. Specifying the optional argument || extends the path after |\tzLFnofyAtEnd| if it exists. (See other examples of using |\tz<..>AtBegin| and |\tz<...>AtEnd|.) \section{\protect\cmd{\tzdefLFn}} \label{s:tzdefLFn} \icmd{\tzdefLFn} simply defines a linear function $ax+b$ and saves it to a macro. You can use |\tzdefLFn| together with |\tzfn| to graph a linear function, \xem{without writing an explicit definition} of a linear function. (Of course, you can directly use |\tzLFn|.) \begin{tzdef} % syntax \tzdefLFn{}()(){} % defaults {}()(){1} \end{tzdef} If |()| is specified, |{}| is ignored. If |()| is missing || is considered as the slope of the line (by default 1). For example, |\tzdefLFn{\Gx}(1,1){.5}| defines as |\Gx| a linear function passing through the point $(1,2)$ with a slope |.5|. That is, it defines a function as $f(x)=.5(x-1)+1$. Knowing two coordinates, linear function |\Gx| passing through the two points can be defined, for example, by |\tzdefLFn{\Gx}(1,2)(3,1)|. That is, it defines a function as $g(x)=\frac{1-2}{3-1}(x-1)+2$. \begin{tztikz} \tzdefLFn{\Fx}(1,2)(3,1) % works like \def\Fx{-1/2*(\x-1)+2} \end{tztikz} \remark If you inadvertently try an \xem{infinite slope}, you will get an \iisw{error message}. \begin{tzcode}{.3} % \tzdefLFn and \tzfn \begin{tikzpicture} \tzhelplines(4,4) \tzaxes(4,4){$x$}{$y$} \tzticks{1,2,3,4}{1,2,3,4} \tzcoors*(1,1)(A){A}[-90](1,2)(B){B}(3,1)(C){C}[45]; \tzdefLFn\Fx(A){.5} \tzdefLFn\Gx(B)(C) \tzfn[red]\Fx[0:4]{$f(x)$}[r] \tzfn[blue]\Gx[0:4]{$g(x)$}[r] \end{tikzpicture} \end{tzcode} \remark The swap version |\tzfn'| simply draws the graph of the inverse function of |\tzfn|. So |\tzfn'(A)(B)| and |\tzfn'(A){.5}| do not guarantee passing through the coordinate |(A)| or |(B)|. \begin{tzcode}{.3} % \tzdefLFn and \tzfn' \begin{tikzpicture} \tzhelplines(4,4) \tzaxes(4,4){$x$}{$y$} \tzticks{1,2,3,4}{1,2,3,4} \tzcoors*(1,1)(A){A}[-90](1,2)(B){B}(3,1)(C){C}[45]; \tzdefLFn\Fx(A){.5} \tzdefLFn\Gx(B)(C) \tzfn'[red]\Fx[0:4]{$f(x)$}[r] \tzfn'[blue]\Gx[0:4]{$g(x)$}[r] \end{tikzpicture} \end{tzcode} %%------------------------------------------------------------ \section{\protect\cmd{\tzdefLFnofy}} \label{s:tzdefLFnofy} \icmd{\tzdefLFnofy} defines a function of |\y|. \begin{tzdef} % syntax \tzdefLFnofy{}()(){} % defaults {}()(){1} \end{tzdef} If |()| is specified, |{}| is ignored. If |()| is missing || is considered as the slope of the line (by default 1). \begin{tztikz} \tzdefLFnofy\Fy(1,1){.5} % works like \def\Fy{.5*(\y-1)+1} \end{tztikz} \begin{tztikz} \tzdefLFnofy\Gy(1,2)(3,1) % works like \def\Gy{-2*(\y-2)+1} \end{tztikz} \remark If you inadvertently try an \xem{infinite slope}, you will get an \xem{error message}. You can use |\tzdefLFnofy| together with |\tzFnofy| to graph a linear function of $y$. (Of course, you can directly use |\tzLFnofy|.) \begin{tzcode}{.3} % \tzdefLFnofy and \tzLFnofy \begin{tikzpicture} \tzhelplines(4,4) \tzaxes*(4,4){$x$}{$y$} \tzticks{1,2,3,4}{1,2,3,4} \tzcoors*(1,1)(A){A}[-90](1,2)(B){B}(3,1)(C){C}[45]; \tzdefLFnofy\Fy(A){.5} \tzdefLFnofy\Gy(B)(C) \tzfnofy[red]\Fy[0:4]{$f(y)$}[r] \tzfnofy[blue]\Gy[0:4]{$g(y)$}[a] \end{tikzpicture} \end{tzcode} \remark The swap version |\tzfnofy'| simply draws the graph of the inverse function of |\tzfnofy|. So |\tzfnofy'(A)(B)| and |\tzfnofy'(A){.5}| do not guarantee passing through the coordinate |(A)| or |(B)|. \begin{tzcode}{.3} % \tzdefLFnofy and \tzLFnofy' \begin{tikzpicture} \tzhelplines(4,4) \tzaxes*(4,4){$x$}{$y$} \tzticks{1,2,3,4}{1,2,3,4} \tzcoors*(1,1)(A){A}[-90](1,2)(B){B}(3,1)(C){C}[45]; \tzdefLFnofy\Fy(A){.5} \tzdefLFnofy\Gy(B)(C) \tzfnofy'[red]\Fy[0:4]{$f(y)$}[r] \tzfnofy'[blue]\Gy[0:4]{$g(y)$}[r] \end{tikzpicture} \end{tzcode} %%================================== \chapter{Some More Functions} \label{c:more-fn} %%------------------------------------------------------------ \section{\texttt{\bs tzpdfN(*)} and \texttt{\bs tzpdfZ}: Normal distributions} \label{s:normaldistributions} |\tzpdfN|, |\tzpdfN*| and |\tzpdfZ| are predefined functions to plot the \iisw{probability density function} (pdf) of a \iisw{normal distribution} $N(\mu,\sigma^2)$. \paragraph{Normal distributions} \icmd{\tzpdfN} accepts two mandatory arguments, |{}| $\mu$ and |{}| $\sigma^2$, to define the pdf function: \[ \frac{1}{\sigma\sqrt{2\pi}} e^{-\frac12\big(\frac{x-\mu}{\sigma}\big)^2} \] \icmd{\tzpdfN*} uses a standard deviation $\sigma$ instead of a variance. With these predefined functions together with |\tzfn| you can plot the pdf of normal distributions. \begin{tzcode}{.3} % \tzpdfN, \tzpdfN* \begin{tikzpicture}[xscale=0.5,yscale=5,font=\scriptsize] \tzhelplines[ystep=0.1](-4,0)(6,.5) \tzaxes(-4,0)(6,.5) \tzticks{1,...,5}{0.1,0.2,0.3,0.4} \tzfn[blue]{\tzpdfN{0}{1.5}}[-4:4] % \tzpdfN \tzfn[red]{\tzpdfN*{2}{sqrt(1.5)}}[-2:6] % \tzpdfN* \end{tikzpicture} \end{tzcode} \begin{tzcode}{.3} % \tzpdfN, \tzpdfN* \begin{tikzpicture}[x=0.5cm,y=5cm,font=\scriptsize] \tzhelplines[step=.5cm](-4,0)(6,.5) \tzaxes(-4,0)(6,.5) \tzticks{1,2,3}{0.1,0.2,0.3,0.4} \tzfn[blue]{\tzpdfN{0}{1.5}}[-4:4] \tzfn[red]{\tzpdfN*{2}{sqrt(1.5)}}[-2:6] \end{tikzpicture} \end{tzcode} \remark If |tikzpicture| is scaled when plotting the inverse function using |\tzfn'|, you may want to change the scale accordingly. \begin{tzcode}{.3} % \tzpdfN and \tzfn' \begin{tikzpicture}[x=0.5cm,y=5cm,,font=\scriptsize] \tzhelplines[step=0.5cm](-4,-.3)(6,.5) \tzaxes(-4,-.3)(6,.5) % scale change \begin{scope}[xscale={1/0.5*5},yscale={1/5*0.5}] \tzfn'[blue]{\tzpdfN{0}{1.5}}[-4:4] \tzfn'[red]{\tzpdfN*{2}{sqrt(1.5)}}[-2:6] \end{scope} \end{tikzpicture} \end{tzcode} \paragraph{Standard normal distributions} \icmd{\tzpdfZ} (with no arguments) represents the pdf of the \xem{standard normal distribution}. \begin{tzcode}{.3} % \tzpdfZ: shift \begin{tikzpicture}[x=0.5cm,y=5cm,font=\scriptsize] \tzhelplines[step=0.5cm](-4,0)(6,.5) \tzaxes(-4,0)(6,.5) \tzticks{1,...,5}{0.1,0.2,0.3,0.4} \tzfn[blue]{\tzpdfZ}[-3:3] % \tzpdfZ \tzfn[red]<2,0>{\tzpdfZ}[-3:3] % shift \tzfn[dashed]<3,.1>{\tzpdfZ}[-3:3] % shift \end{tikzpicture} \end{tzcode} %%------------------------------------------------------------ \section{\protect\cmd{\tzfnarea(*)}: Fill under the graph} \subsection{\protect\cmd{\tzfnarea(*)}} \icmd{\tzfnarea} fills the area between the graph of a function and the x axis, with a color or pattern, on the |behind| layer by default. With \icmd{\settzfnarealayer}, you can change the layer of |\tzfnarea|. |\tzfnarea| accepts two mandatory arguments: |{}| and |[]|, like |\tzfn|. \begin{tzdef} % syntax: minimum \tzfnarea{}[] % syntax: full \tzfnarea[]{}[]{} % defaults []{}[]{.3}<> \end{tzdef} \begin{tzcode}{.3} % \tzfnarea \begin{tikzpicture} \tzhelplines(0,-1)(4,2) \tzaxes(0,-1)(4,2) \def\Fx{.5*(\x-1)^2-1} \tzfn[very thick]\Fx[0:3.5] \tzfnarea[fill=red]\Fx[1:3] % \end{tikzpicture} \end{tzcode} \begin{tzcode}{.3} % \tzfnarea: layer: comparison \begin{tikzpicture} \tzhelplines(0,-1)(4,2) \settzfnarealayer{main} %% \tzaxes(0,-1)(4,2) \def\Fx{.5*(\x-1)^2-1} \tzfn[very thick]\Fx[0:3.5] \tzfnarea[fill=red]\Fx[1:3] % \end{tikzpicture} \end{tzcode} The starred version \icmd{\tzfnarea*} fills the area with |fill=black!50| and |fill opacity=.3|, and |text opacity=1|, by default. The default values can be changed by |\settzfillcolor|, |\settzfillopacity|, and the option |{}|. \begin{tzcode}{.3} % \tzfnarea* \begin{tikzpicture}[x=0.5cm,y=5cm,font=\scriptsize] \tzhelplines[step=.5cm](-4,-.1)(6,.5) \tzaxes(-4,-.1)(6,.5) \tzfn[blue]{\tzpdfZ}[-3:3] \tzfnarea*{\tzpdfZ}[-3:1] \tzfn"AA"{\tzpdfN21}[-1:5] \tzfnarea*[pattern=north east lines]{\tzpdfN21}[1:3] \end{tikzpicture} \end{tzcode} \begin{tzcode}{.3} % \tzfnarea*: default change and \begin{tikzpicture} \settzfnarealayer{main} % \tzhelplines(0,-1)(4,2) \tzaxes(0,-1)(4,2) \def\Fx{.5*(\x-1)^2-1} \tzfn\Fx[0:3.5] \tzfnarea*[red]\Fx[1:3]{.1} <(2,-1) node[black]{Area}> \end{tikzpicture} \end{tzcode} \begin{tzcode}{.3} % \tzfnarea* \begin{tikzpicture} \tzhelplines(0,-2)(4,3) \tzaxes(0,-2)(4,3){$x$}{$y$} \def\Fx{.5*(\x-1)^2-1} \tzfn\Fx[0:3.5]{$f(x)$}[a] \tzfnarea*[red]\Fx[1:3] \tzvXpointat{Fx}{1}(A) \tzvXpointat{Fx}{3}(B) \tzline[blue,thick](A)(A|-0,0) \tzline[very thick](B)(B|-0,0) \end{tikzpicture} \end{tzcode} \subsection{\protect\cmd{\tzfnarealine(')}} \icmd{\tzfnarealine} draws one or two boundary lines of |\tzfnarea| using |\tzto|, on the |behind| layer by default. The layer can be changed by \icmd{\settzfnarealayer}. It takes two mandatory arguments: |{}| and |{}|. \begin{itemize}\firmlist \item |\tzfnarealine{}{}| draws a vertical line to the $x$ axis at ||. \item |\tzfnarealine{}{}{}| draws two vertical lines at || and ||. \end{itemize} The first option |[]| controls both lines and is overwritten by each of |[]| (for the line at ||) and |[]| (for the line at ||). The line width is |very thin| by default, which can be changed by \icmd{\settzfnarealinestyle}. You can also change the length of lines by specifying |()| and |()|. \begin{tzdef} % syntax: minimum \tzfnarealine{}{} % syntax: minimal \tzfnarealine{}{}{} % syntax: medium \tzfnarealine{}{}[]{}[] % syntax: full \tzfnarealine[]{}{}[]() {}[]() % defaults: [very thin]{}{}[](0,0){}[](0,0) \end{tzdef} \begin{tzcode}{.3} % \tzfnarealine \begin{tikzpicture}[x=0.5cm,y=5cm,font=\scriptsize] \tzhelplines[step=.5cm](-4,-.1)(6,.5) \tzaxes(-4,-.1)(6,.5) \tzfn"AA"{\tzpdfN21}[-1:5] \tzfnarea*[pattern=north east lines]{\tzpdfN21}[1:3] \tzfnarealine[red]{AA}{1}{3} %% \end{tikzpicture} \end{tzcode} \begin{tzcode}{.3} % \tzfnarealine: one line \begin{tikzpicture} \tzhelplines(0,-1)(4,2) \tzaxes(0,-1)(4,2) \def\Fx{.5*(\x-1)^2-1} \tzfn\Fx[0:3.5] \tzfnarea*[red]\Fx[1:3]{.1}<(2,-1) node[black]{Area}> \tzfnarealine[blue]{Fx}{3} \end{tikzpicture} \end{tzcode} \begin{tzcode}{.3} % \tzfnarealine: two lines \begin{tikzpicture} \tzhelplines(0,-1)(4,2) \tzaxes(0,-1)(4,2) \def\Fx{.5*(\x-1)^2-1} \tzfn\Fx[0:3.5] \tzfnarea*[red]\Fx[1:3]{.1}<(2,-1) node[black]{Area}> \tzfnarealine[blue,thick]{Fx}{1}{3}[very thick,red] \end{tikzpicture} \end{tzcode} The \xem{swap version} \icmd{\tzfnarealine'} draws one or two horizontal lines from the point $(x_i,f(x_i))$ to the $y$ axis. Everything else is the same as in |\tzfnarealine|. \begin{tzcode}{.3} % \tzfnarealine' \begin{tikzpicture} \tzhelplines(0,-1)(4,2) \settzfnarealinestyle{thick} \tzaxes(0,-1)(4,2) \def\Fx{.5*(\x-1)^2-1} \tzfn\Fx[0:3.5] \tzfnarea*[blue]\Fx[1:3]{.1}<(2,-1) node[black]{Area}> \tzfnarealine'[->,red]{Fx}{2}{3} \end{tikzpicture} \end{tzcode} %%------------------------------------------------------------ \section{Envelope curves} \label{s:evelopecurves} %%------------------------------------------------------------ \subsection{\protect\cmd{\tzfnmax}: Upper envelope curves} \label{ss:tzfnmax} \icmd{\tzfnmax} plots the maximum of a list of functions, that is, an \xem{upper} \iisw{envelope curve}. The first mandatory argument should be a comma separated list of functions. The second mandatory argument |[]| should be colon separated. The default line width of |\tzfnmax| is |thick|. \begin{tzdef} % syntax: minimum \tzfnmax{}[] % syntax: full \tzfnmax[]"" {}[]{}[] % remark: - {} should be comma separated - [] should be of the form [] % defaults [thick,samples=201]<>""{}[]{}[]<> \end{tzdef} \begin{tzcode}{.3} % \tzfnmax \begin{tikzpicture} \tzhelplines*(4,4) \def\Fx{\x} \def\Gx{.5*\x+.5} \def\Hx{-.25*\x+2} \tzfn{\Fx}[0:4] \tzfn{\Gx}[0:4] \tzfn{\Hx}[0:4] \tzfnmax[blue]{\Fx,\Gx,\Hx}[0:4]{upper envelope}[l] \end{tikzpicture} \end{tzcode} \remark If you want sharp corners at kinked points, you may need to select an appropriate number of sample points, which is |samples=201|, by default. You can try an odd number. \remarkafterskip If you want, you can shift and extend path using the option || and ||, respectively. You can also use \icmd{\tzfnmaxAtBegin} and \icmd{\tzfnmaxAtEnd} to extend the path of |\tzfnmax| at the beginning and at the end, respectively. \begin{tzcode}{.3} % shift, \begin{tikzpicture} \tzhelplines*(4,5) \def\Fx{\x} \def\Gx{.5*\x+.5} \def\Hx{-.25*\x+2} \tzfn{\Fx}[0:4] \tzfn{\Gx}[0:4] \tzfn{\Hx}[0:4] \tzfnmax[blue,thick]{\Fx,\Gx,\Hx}[0:4] \tzfnmaxAtBegin{ (-1,0) -- } \tzfnmax[dashed]<0,.5>{\Fx,\Gx,\Hx}[0:4] < to[bend left] ++ (1,-1) > \end{tikzpicture} \end{tzcode} %%------------------------------------------------------------ \subsection{\protect\cmd{\tzfnmin}: Lower envelope curves} \label{ss:tzfnmin} \icmd{\tzfnmin} plots the minimum of a list of functions. |\tzfnmin| works just like |\tzfnmax|, but it draws a \xem{lower} \iisw{envelope curve}. \begin{tzdef} % syntax: minimum \tzfnmin{}[] % syntax: full \tzfnmin[]"" {}[]{}[] % remark: - {} should be comma separated - [] should be of the form [] % defaults [thick,samples=201]<>""{}[]{}[]<> \end{tzdef} \begin{tzcode}{.3} % \tzfnmin, \tzfnmax: name path: intersection \begin{tikzpicture} \tzhelplines(4,6) \def\Fx{\x} \def\Gx{.5*(\x)^2} \def\Hx{-.25*\x+2} \tzfn{\Fx}[0:4]{$f(x)$}[r] \tzfn{\Gx}[0:3]{$g(x)$}[r] \tzfn{\Hx}[0:4]{$h(x)$}[r] \tzfnmin[samples=2001,blue,thick]"XX" %% {\Fx,\Gx,\Hx}[0:4]{lower evelope}[bl] \tzvXpointat*{XX}{3} \tzfnmax[samples=201,red,thick]"YY" %% {\Fx,\Gx,\Hx}[0:3]{upper envelope}[bl] \tzvXpointat*[fill=none]{YY}{2.5} %% \end{tikzpicture} \end{tzcode} \remark If you want sharp corners at kinked points, you may need to select appropriate number of sample points. Try odd number. To extend the path of |\tzfnmin|, you can use the option || or the macros \icmd{\tzfnminAtBegin} and \icmd{\tzfnminAtEnd}. %%================================== \chapter{Intersections} \label{c:intersections} %%------------------------------------------------------------ \section{\protect\cmd{\tzXpoint(*)}: Intersection points} \label{s:intersections} \icmd{\tzXpoint} finds \iisw{intersection} points of two paths and saves them as coordinate names for later use. \begin{tzdef} % syntax: minimal \tzXpoint{}{}() % syntax: medium \tzXpoint{}{}(){