%% ============================================= %% IMPORTANT NOTICE: %% %% This program can be redistributed and/or modified under the terms %% of the LaTeX Project Public License Distributed from CTAN %% archives in directory macros/latex/base/lppl.txt; either %% version 1 of the License, or any later version. %% %% Only a few abbreviated comments remain here to describe the usage. %% Documentation can be found in bardiag.ps or/and bardiag.tex files %% ============================================= %% Copyright 2003 Roman Stepanyan %% E-mail: rstepanyan@yahoo.com %TODO % Error ``whiskers'': do NOT work with \subtopbaritem !!!! \NeedsTeXFormat{LaTeX2e}[1995/12/01] % \ProvidesPackage{bardiag}[2003/12/10 version 0.5] \def\bardiag{BagDiag} % This package allows to draw bar diagrams. % It is inspired by and build on top of PSTricks % % % Changelog % 2003/12/10 version 0.5 (compatible with 0.4, but "shapes"-macroses % (bars) have to accept an optional argument!) % "fillstyle" can be supplied to \baritem and friends % as an optional argument: \baritem[fillstyle=vlines*,linecolor=red]{}... % bardiag DOES NOT load pst-all anymore, only the necessary stuff % use \barspergroup{N} to make life easier (thanks to Kris Dumont) % % % 2003/06/29 version 0.4 (compatible with 0.3) % Error ``whiskers'' are added % % 2003/06/20 version 0.3 (compatible with 0.2) % ``Horizontal bars'' mode is added. % % 2003/05/23 version 0.2 (not compatible with 0.1) % Code is completely rewritten. % All parameters can be real numbers (not integers) thanks to fp.sty % A lot of changes in the interface. % % 2003/05/10 version 0.1 % 0.first version :) \RequirePackage{calc} \RequirePackage{pstfp} \RequirePackage{fp-snap} \RequirePackage{pstricks} \RequirePackage{pstcol} \RequirePackage{pst-grad} \RequirePackage{multido} \RequirePackage{ifthen} % * what should be changed through \renewcommand or \setlength % @ arguments of functions % + internal variables %---------------------------------------- % Horizontal or vertical bars \newcommand{\bdvert}{0} \newcommand{\bdhor}{1} \newcommand{\bdorientation}{\bdvert} % Each group is assumed to consist of this number of bars % (subtopbars not included) % use \barspergroup{N} to change \newcommand{\nbarsingroup}{1} \newcommand{\barspergroup}[1]{\renewcommand{\nbarsingroup}{#1}} % Sizes of the diag % \newcommand{\diagheight}{10} % units @ \newcommand{\diagwidth}{10} % units @ \newlength{\bottomheight} % cm @ % units of length \newlength{\xunitlength} % cm @ \newlength{\yunitlength} % cm @ % of the bar \newcommand{\dbar}{1} % units @ \newcommand{\dx}{2} % units @ %----------------------------------------- % Sizes related to ticks and levellines % \newcommand{\betweenticks}{1} % units * \newcommand{\numberofticks}{1}% + \newcommand{\MAXnumberofticks}{20}% * % % frame and stuff \newlength{\ticklength} % \setlength{\ticklength}{2mm} % cm * \newlength{\leftshift} \setlength{\leftshift}{\ticklength+2mm} % cm * \newlength{\frameXleft} \setlength{\frameXleft}{\leftshift} \newlength{\frameYbottom} \setlength{\frameYbottom}{0pt} \newlength{\tickrightedge} % cm + % text \newlength{\textoffset} % \setlength{\textoffset}{-0.2cm}%cm * %caption \newlength{\captionoffset} \setlength{\captionoffset}{1.5cm} %----------------------------------------- % ``Counter''-like variables for bars \newcommand{\xval}{1} % units + \newcommand{\xxval}{1} % units + \newcommand{\xhalf}{1} % units + % % and subbars \newcounter{subbar} % % Number on bars % numbers (0,1) \newcommand\shownumbers{1} % * % otherwise no numbers will appear \newcommand\numbercolor{\black\bf} % * \newcommand{\belowtop}{0} % constant \newcommand{\overtop}{1} % constant \newcommand{\bottom}{2} % constant \newcommand\placenumber{\belowtop} % * % can be: \belowtop, \overtop, \bottom \newlength{\numberoffset} \setlength{\numberoffset}{2\textoffset} % cm * \newlength{\lefttextoffset} \setlength{\lefttextoffset}{\leftshift+2mm} % cm * % Angle of the text written below (if vertical bars) % or to the left (if horizontal) of the item-bars \newcommand{\barlabelangle}{90} % * % The same, but for label next to the level line \newcommand{\ticklabelangle}{0} % * %---------------------------------------- % Legend-related vars \newcommand{\legendShadow}{0} % * % shadow color \definecolor{legShCol}{gray}{.5} \newcommand{\legendShadowColor}{legShCol} % * %---------------------------------------- % 3D related stuff \newcommand{\frameTD}{0} % 3D or not frame % * \newcommand{\tdx}{0.4} % depth of 3d % * \newcommand{\tdy}{1.0} % * \newcommand{\tdhor}{\tdx} % + \newcommand{\tdver}{\tdy} % + %----------------------------------------- % Error ``whiskers'' \newcommand{\barerrorterm}{*-|} % * \newpsstyle{barerrorstyle}{linewidth=2pt,linecolor=black} %----------------------------------------- % Styles \definecolor{frameBGgray}{gray}{0.9} \newpsstyle{diagframestyle}{linewidth=1pt,linecolor=black,fillstyle=none} \newpsstyle{tickstyle}{linewidth=1pt,linecolor=black} \newpsstyle{levellinestyle}{linewidth=0.2pt,linecolor=blue} \newpsstyle{diagTDframestyle}{linewidth=1pt,linecolor=black,fillstyle=none} \newpsstyle{diagbgframestyle}{linewidth=1pt,linecolor=black,fillcolor=frameBGgray} %----------------------------------------- \newcommand{\tmpvar}{1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Commands to begin a bar diagram % \bardiagbegin -> flat frame % \bardiagTDbegin -> 3D frame \newlength{\bgx} % + \newlength{\bgy} % + \newlength{\bgxa} % + \newlength{\bgya} % + % \newcommand{\bardiagrambegin}[7] { % 1 2 3 4 5 6 7 % width, height,bottom(cm), dbar, dx, xunit, yunit % height(#1) and width(#2) can be any real numbers, % they are in units of (#6) & (#7) \renewcommand{\nbarsingroup}{1} % Default \tdy is 5% from the height of the diag \FPdiv{\tmpvar}{#2}{\dbar}% \FPmul{\tdy}{0.05}{\tmpvar}% % \ifthenelse{\bdorientation = \bdvert}% { \renewcommand{\diagheight}{#2}% \renewcommand{\diagwidth}{#1}% \setlength{\bottomheight}{#3}% \renewcommand{\dbar}{#4}% \renewcommand{\dx}{#5}% \setlength{\xunitlength}{#6}% \setlength{\yunitlength}{#7}% % \renewcommand{\tdhor}{\tdx}% \renewcommand{\tdver}{\tdy}% % \setlength{\frameXleft}{\leftshift} \setlength{\frameYbottom}{0pt} % \renewcommand{\barlabelangle}{90} %\renewcommand{\ticklabelangle}{0} }% { \renewcommand{\diagheight}{#1}% \renewcommand{\diagwidth}{#2}% \setlength{\bottomheight}{#3}% \renewcommand{\dbar}{#4}% \renewcommand{\dx}{#5}% \setlength{\xunitlength}{#7}% \setlength{\yunitlength}{#6}% % \renewcommand{\tdhor}{\tdy}% \renewcommand{\tdver}{\tdx}% % \setlength{\frameXleft}{0pt} \setlength{\frameYbottom}{\leftshift} % \renewcommand{\barlabelangle}{0} %\renewcommand{\ticklabelangle}{0} }% % %- - - - - - - - - - - - - - - - - - - - % Take care of ticks (not to draw) \ifthenelse{\bdorientation = \bdvert}% { \FPdiv{\tmpvar}{\diagheight}{\betweenticks}}% { \FPdiv{\tmpvar}{\diagwidth}{\betweenticks}}% \FPtrunc{\numberofticks}{\tmpvar}{0}% \ifthenelse{\numberofticks > \MAXnumberofticks}% { \typeout{----- \bardiag WARNING: }% \typeout{Too LARGE number of ticks: \numberofticks. Falling back to \MAXnumberofticks.}% \typeout{TIP: try to change the betweenticks parameter.}% \typeout{If you DO want such a large number of ticks,}% \typeout{change the MAXnumberofticks parameter.}% \typeout{Ignore this warning if you do not use ticks.}% \typeout{-----}% \renewcommand{\numberofticks}{\MAXnumberofticks}% \FPdiv{\betweenticks}{\diagheight}{\numberofticks}% }% {}% %- - - - - - - - - - - - - - - - - - - - % Compute center of the diagram \FPdiv{\hordiagcenter}{\diagwidth}{2}% \FPdiv{\vertdiagcenter}{\diagheight}{2}% % %- - - - - - - - - - - - - - - - - - - - % \psset{xunit=\xunitlength,yunit=\yunitlength}% \ifthenelse{\frameTD = 0} {\begin{pspicture}(-\captionoffset,-\bottomheight)(\diagwidth,\diagheight)} {\setlength{\bgya}{\yunitlength*\real{\diagheight}+\yunitlength*\real{\dbar}*\real{\tdver}} \begin{pspicture}(-\captionoffset,-\bottomheight)(\diagwidth,\bgya) } %\showgrid %#For debug purposes \psset{fillstyle=solid}% \renewcommand{\xval}{0}% \setlength{\tickrightedge}{-\leftshift+\ticklength}% \ifthenelse{\frameTD = 0}% {\renewcommand{\legendShadow}{0}% % let's draw a frame \psframe[style=diagframestyle](-\frameXleft,-\frameYbottom)(\diagwidth,\diagheight)% }% {\renewcommand{\legendShadow}{1}% % background frame \setlength{\bgx}{-\frameXleft+\xunitlength*\real{\dbar}*\real{\tdhor}}% \setlength{\bgxa}{\frameXleft+\bgx+\xunitlength*\real{\diagwidth}}% \setlength{\bgy}{\yunitlength*\real{\dbar}*\real{\tdver}-\frameYbottom}% \setlength{\bgya}{\bgy+\yunitlength*\real{\diagheight}+\frameYbottom} % let's draw it \psframe[style=diagbgframestyle](\bgx,\bgy)(\bgxa,\bgya)% \psline(-\frameXleft,\diagheight)(\bgx,\bgya)% \psline(-\frameXleft,-\frameYbottom)(\bgx,\bgy)% \psline(\diagwidth,-\frameYbottom)(\bgxa,\bgy)% \psline(\diagwidth,\diagheight)(\bgxa,\bgya)% % let's draw the foreground frame \psframe[style=diagTDframestyle](-\frameXleft,-\frameYbottom)(\diagwidth,\diagheight)% }% }% % - - - - - - - - - - - - - - - - - - \newcommand{\bardiagramend}[2] { \ifthenelse{\frameTD = 1} { % let's draw the frame ones again \psframe[style=diagTDframestyle](-\frameXleft,-\frameYbottom)(\diagwidth,\diagheight) }{} \ifthenelse{\bdorientation = \bdvert} { \rput[c](\hordiagcenter,-0.9\bottomheight){{#1}} \rput[c]{90}(-\captionoffset,\vertdiagcenter){{#2}} % ???? -2cm ? } { \rput[c](\hordiagcenter,-0.9\bottomheight){{#2}} \rput[c]{90}(-\captionoffset,\vertdiagcenter){{#1}} % ???? -2cm ? } \end{pspicture} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % BARITEMS: \newcommand{\ActiveBarPrimitive}{\barRect} \newcommand{\subtopx}{0} \newcommand{\subtopy}{0} \newcommand{\baritem}[4][fillstyle=solid]{% % the first (optional) argument is "psstyle options": default=solid % [style], name, value, color % % \xval and \xxval are left and right edges of a bar % \xhalf is its center % \FPfadd{\xxval}{\xval}{\dbar} \FPfadd{\tmpvar}{\xval}{\xxval} \FPdiv{\xhalf}{\tmpvar}{2}% ?????????? Get rid of it? % % Now we call smth, which draws a ``bar'' % it can be rectangular, cylindrical, 2 or 3d - we do not know % I plan \barRect; \barTDRect; \barCylinder; more??? % It takes 5 arguments: % \something{\xval}{\yval}{\xxval}{\yyval}{color} % % \ifthenelse{\bdorientation = \bdvert}%is it vertical or horizontal? {\ActiveBarPrimitive[#1]{\xval}{0}{\xxval}{#3}{#4}}% {\ActiveBarPrimitive[#1]{0}{\xval}{#3}{\xxval}{#4}}% % % \printnumber{\xhalf}{#3}{0}{#3} % \FPset{\subtopx}{\xval} \FPset{\subtopy}{#3} % \FPfadd{\tmpvar}{\xval}{\dx} \FPset{\xval}{\tmpvar} % % \xhalf := \xhalf + \dbar * (\nbarsingroup - 1)/2 \FPfsub{\tmpvar}{\nbarsingroup}{1} \FPdiv{\tmpvar}{\tmpvar}{2} \FPmul{\tmpvar}{\tmpvar}{\dbar} \FPfadd{\xhalf}{\xhalf}{\tmpvar} \ifthenelse{\bdorientation = \bdvert}%is it vertical or horizontal? {\printbarlabel{\xhalf}{\textoffset}{\barlabelangle}{#2}}% {\printbarlabel{\textoffset}{\xhalf}{\barlabelangle}{#2}}% \setcounter{subbar}{1} } \newcommand{\barmidx}{0} \newcommand{\barerrormargins}[2] % To make asymmetric margins % 1st = upper Dy; 2nd = bottom Dy {% \ifthenelse{\bdorientation = \bdvert}%is it vertical or horizontal? { \FPdiv{\tmpvar}{\dbar}{2} \FPfadd{\barmidx}{\subtopx}{\tmpvar} \FPfadd{\tmpvar}{\subtopy}{#1} \psline[style=barerrorstyle]{\barerrorterm}(\barmidx,\subtopy)(\barmidx,\tmpvar) % \FPdiv{\tmpvar}{\dbar}{2} \FPfadd{\barmidx}{\subtopx}{\tmpvar} \FPfsub{\tmpvar}{\subtopy}{#2} \psline[style=barerrorstyle]{\barerrorterm}(\barmidx,\subtopy)(\barmidx,\tmpvar) } { \FPdiv{\tmpvar}{\dbar}{2} \FPfadd{\barmidx}{\subtopx}{\tmpvar} \FPfadd{\tmpvar}{\subtopy}{#1} \psline[style=barerrorstyle]{\barerrorterm}(\subtopy,\barmidx)(\tmpvar,\barmidx) % \FPdiv{\tmpvar}{\dbar}{2} \FPfadd{\barmidx}{\subtopx}{\tmpvar} \FPfsub{\tmpvar}{\subtopy}{#2} \psline[style=barerrorstyle]{\barerrorterm}(\subtopy,\barmidx)(\tmpvar,\barmidx) } } %%%%%%%%%%%%% \newcommand{\barerror}[1] % To make symmetric margins { \barerrormargins{#1}{#1} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % SUBITEMS \newcommand{\subxval}{0} \newcommand{\subxxval}{0} \newcommand{\subbaritem}[4][fillstyle=solid]{ % [style], name, value, color % % \subxval and \subxxval are left and right edges of a bar % \subxhalf is its center % \FPfsub{\subxxval}{\xval}{\dx} \FPmul{\tmpvar}{\dbar}{\thesubbar} \FPfadd{\subxval}{\subxxval}{\tmpvar} \FPfadd{\subxxval}{\subxval}{\dbar} \FPfadd{\tmpvar}{\subxval}{\subxxval} \FPdiv{\subxhalf}{\tmpvar}{2}% ?????????? Get rid of it? % % Now we call smth, which draws a ``bar'' % it can be rectangular, cylindrical, 2 or 3d - we do not know % I plan \barRect; \barTDRect; \barCylinder; ??? % It takes 5 arguments: % \something{\xval}{\yval}{\xxval}{\yyval}{color} % \ifthenelse{\bdorientation = \bdvert}%is it vertical or horizontal? {\ActiveBarPrimitive[#1]{\subxval}{0}{\subxxval}{#3}{#4}}% {\ActiveBarPrimitive[#1]{0}{\subxval}{#3}{\subxxval}{#4}}% % % \printnumber{\subxhalf}{#3}{0}{#3} \FPset{\subtopx}{\subxval} \FPset{\subtopy}{#3} %\rput[r]{90}(\subxhalf,\textoffset){#2} \ifthenelse{\bdorientation = \bdvert}%is it vertical or horizontal? {\printbarlabel{\subxhalf}{\textoffset}{\barlabelangle}{#2}}% {\printbarlabel{\textoffset}{\subxhalf}{\barlabelangle}{#2}}% \addtocounter{subbar}{1} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % TOP SUBITEMS \newcommand{\subtopxx}{0} % + \newcommand{\subtopyy}{0} % + \newcommand{\subtopxhalf}{0}% + \newcommand{\subtopbaritem}[4][fillstyle=solid]{ % [style], name, value, color % % % \subtopxhalf is the center % \FPfadd{\subtopxx}{\subtopx}{\dbar} \FPfadd{\subtopyy}{\subtopy}{#3} \FPfadd{\tmpvar}{\subtopx}{\subtopxx} \FPdiv{\subtopxhalf}{\tmpvar}{2}% % \ifthenelse{\bdorientation = \bdvert}%is it vertical or horizontal? {\ActiveBarPrimitive[#1]{\subtopx}{\subtopy}{\subtopxx}{\subtopyy}{#4}}% {\ActiveBarPrimitive[#1]{\subtopy}{\subtopx}{\subtopyy}{\subtopxx}{#4}}% % % \printnumber{\subtopxhalf}{#3}{\subtopy}{\subtopyy} % % it is not supposed to print any label, so, % we do not need to tae care of it. %\rput[r]{90}(\subxhalf,\textoffset){#1} %\addtocounter{subbar}{1} % \FPset{\subtopy}{\subtopyy} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Bar primitives \input{bardiag.bar} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Legend \newlength{\legendXo} % this one is an argument of diagLegendbegin \newlength{\legendYo} % the same \newlength{\legendWidth} % the same \newlength{\legendHeight} % this will be computed % \newlength{\legenditemheight}\setlength{\legenditemheight}{7mm} \newlength{\legendspacer}\setlength{\legendspacer}{3mm} \newlength{\legendRectWidth}\setlength{\legendRectWidth}{6mm} \newlength{\legendRectHeight}\setlength{\legendRectHeight}{4mm} % \newcommand{\diagLegendoptions}[3] { % 1 2 3 % bgcolor framecolor framelinewidth \newpsstyle{diagLegenditemstyle}{fillstyle=solid,fillcolor=#1,linecolor=#1} \newpsstyle{diagLegendframetyle}{fillstyle=none,linecolor=#2,linewidth=#3} } %First we call \diagLegendoptions \diagLegendoptions{white}{black}{0.5pt} % \newlength{\lixcoor} \newlength{\liycoor} \newlength{\lixxcoor} \newlength{\liyycoor} % \newlength{\liix} % where to put the rectangle with color \newlength{\liiix} % where to put the text % \newcommand{\diagLegendbegin}[3] {% 1 2 3 % Xo(units) Yo(un) Width(un) % (Xo,Yo) are coordinates of the left-up corner \ifthenelse{\bdorientation = \bdvert}% { \setlength{\legendXo}{\xunitlength*\real{#1}} \setlength{\legendYo}{\yunitlength*\real{#2}} \setlength{\legendWidth}{\xunitlength*\real{#3}} \setlength{\legendHeight}{0cm} % \setlength{\lixcoor}{\legendXo} \setlength{\lixxcoor}{\legendXo+\legendWidth} \setlength{\liycoor}{\legendYo} % \setlength{\liix}{\lixcoor+\legendspacer} \setlength{\liiix}{\liix+\legendRectWidth+\legendspacer} } { \setlength{\legendXo}{\xunitlength*\real{#2}} \setlength{\legendYo}{\yunitlength*\real{#1}} \setlength{\legendWidth}{\yunitlength*\real{#3}} \setlength{\legendHeight}{0cm} % \setlength{\lixcoor}{\legendXo} \setlength{\lixxcoor}{\legendXo+\legendWidth} \setlength{\liycoor}{\legendYo} % \setlength{\liix}{\lixcoor+\legendspacer} \setlength{\liiix}{\liix+\legendRectWidth+\legendspacer} } } \newlength{\lShX} \newlength{\lShXxx} \newlength{\lShY} \newlength{\lShYyy} \newcommand{\diagLegendend} { \ifthenelse{\legendShadow = 1} {\setlength{\lShX}{\legendXo+\xunitlength*\dbar*\real{\tdhor}} \setlength{\lShXxx}{\lixxcoor+\xunitlength*\dbar*\real{\tdhor}} \setlength{\lShY}{\liycoor+\yunitlength*\dbar*\real{\tdver}} \setlength{\lShYyy}{\legendYo+\yunitlength*\dbar*\real{\tdver}} \psframe[fillstyle=solid,linecolor=\legendShadowColor,fillcolor=\legendShadowColor](\lShX,\legendYo)(\lShXxx,\lShYyy) \psframe[fillstyle=solid,linecolor=\legendShadowColor,fillcolor=\legendShadowColor](\lixxcoor,\lShY)(\lShXxx,\lShYyy) } {} \psframe[style=diagLegendframetyle](\legendXo,\liycoor)(\lixxcoor,\legendYo) } \newlength{\legendRectXo} \newlength{\legendRectX} \newlength{\legendRectYo} \newlength{\legendRectY} % \newcommand{\legendPutRect}[2][fillstyle=solid] { \setlength{\legendRectXo}{\liix} \setlength{\legendRectYo}{(\liyycoor+\liycoor-\legendRectHeight)/2} %\setlength{\legendRectYo}{(\liyycoor+\liycoor)/2-\legendRectHeight} \setlength{\legendRectX}{\legendRectXo+\legendRectWidth} \setlength{\legendRectY}{\legendRectYo+\legendRectHeight} \psframe[fillcolor=#2,#1](\legendRectXo,\legendRectYo)(\legendRectX,\legendRectY) } \newlength{\legendiyc} \newcommand{\diagLegenditem}[3][fillstyle=solid] {% [1] 2 3 % style item_text color \addtolength{\legendHeight}{\legenditemheight} \setlength{\liyycoor}{\liycoor} \addtolength{\liycoor}{-\legenditemheight} \psframe[style=diagLegenditemstyle](\lixcoor,\liycoor)(\lixxcoor,\liyycoor) \legendPutRect[#1]{#3} \setlength{\legendiyc}{(\liycoor+\liyycoor)/2} \rput[l](\liiix,\legendiyc){#2} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Util \newcommand{\outputparameters} {\rput[lt](0,-2\bottomheight){\parbox{10cm}{ \begin{tabular}{p{5cm}p{5cm}} Width: & \diagwidth \\\hline Height: &\diagheight \\\hline Width of a bar:& \dx \\\hline Distance between bars:& \dbar\\\hline\hline %X unit length: & \ratio{\xunitlength}{1cm}\\\hline %Y unit length: & \ratio{\yunitlength}{1cm}\\\hline TICKS:\\ Between ticks: & \betweenticks\\ Number of ticks:&\numberofticks (computed)\\ \hline\hline LAST VALS:\\ xval: & \xval\\ dbar: & \dbar\\ xxval:& \xxval\\ xhalf:& \xhalf\\ tmpvar:&\tmpvar\\ \end{tabular}}} } %-------------------------------------------------------------------- \newlength{\ycoordnum} % \newcommand\printnumber[4] { % 1 2 3 4 % center of the bar, text(number) (will be centered), bottom y, top y % % we compute the y-position of the text depending on % the value of the \placenumber parameter % it can be: \belowtop, \overtop, \bottom \ifthenelse{\bdorientation = \bdvert} { \ifthenelse{\placenumber = \overtop} {\setlength{\ycoordnum}{\yunitlength*\real{#4}-\numberoffset} \ifthenelse{\shownumbers = 1} {\rput[bc](#1,\ycoordnum){\numbercolor #2}}{} } {%else \ifthenelse{\placenumber = \bottom} {\setlength{\ycoordnum}{\yunitlength*\real{#3}-\numberoffset} \ifthenelse{\shownumbers = 1} {\rput[bc](#1,\ycoordnum){\numbercolor #2}} {} } % default->\belowtop {\setlength{\ycoordnum}{{\yunitlength*\real{#4}}+\numberoffset} \ifthenelse{\shownumbers = 1 \AND \lengthtest{\ycoordnum > -\numberoffset}} {\rput[tc](#1,\ycoordnum){\numbercolor #2}}{} } } } {%else, i.e. if it is horisontal %if fact, ``y-coordinate'' \ycoordnum is now along the horizontal axis \ifthenelse{\placenumber = \overtop} { \setlength{\ycoordnum}{\xunitlength*\real{#4}-\numberoffset} \ifthenelse{\shownumbers = 1} {\rput[l](\ycoordnum,#1){\numbercolor #2}}{} } {%else \ifthenelse{\placenumber = \bottom} {\setlength{\ycoordnum}{\xunitlength*\real{#3}-\numberoffset} \ifthenelse{\shownumbers = 1} {\rput[l](\ycoordnum,#1){\numbercolor #2}} {} } % default->\belowtop {\setlength{\ycoordnum}{{\xunitlength*\real{#4}}+\numberoffset} \ifthenelse{\shownumbers = 1 \AND \lengthtest{\ycoordnum > -\numberoffset}} {\rput[r](\ycoordnum,#1){\numbercolor #2}}{} } %\rput[tc](\ycoordnum,#1){\numbercolor #2} } } } %-------------------------------------------------------------------- \newlength{\ytick} \newcommand{\whattoprint}{0} % \newcommand{\drawlevellines} {\ifthenelse{\bdorientation = \bdvert} {\rput[c]{\ticklabelangle}(-\lefttextoffset,0){0}}% this is 0 {\rput[c]{\ticklabelangle}(0,-\lefttextoffset){0}} % let's draw ticks; then lines; % they are controlled by \betweenticks variable % on its basis we have computed \numberofticks above (in \diagbegin) % \multido{\n=1+1}{\numberofticks}{% \ifthenelse{\bdorientation = \bdvert} {\setlength{\ytick}{\yunitlength*\real{\betweenticks}*\n} % tick itself \psline[style=tickstyle](-\leftshift,\ytick)(\tickrightedge,\ytick) % level lines \psline[style=levellinestyle](\tickrightedge,\ytick)(\diagwidth,\ytick) % numbers! \FPmul{\whattoprint}{\n}{\betweenticks} \FPclip{\whattoprint}{\whattoprint} \rput[r](-\lefttextoffset,\ytick){\whattoprint} } {\setlength{\ytick}{\xunitlength*\real{\betweenticks}*\n} \psline[style=tickstyle](\ytick,-\leftshift)(\ytick,\tickrightedge) \psline[style=levellinestyle](\ytick,\tickrightedge)(\ytick,\diagheight) \FPmul{\whattoprint}{\n}{\betweenticks} \FPclip{\whattoprint}{\whattoprint} \rput[c](\ytick,-\lefttextoffset){\whattoprint} } } } %- - - - - - - - - - - - - - - - - - - - \newcommand{\printbarlabel}[4]{ % x, y, angle, text \ifthenelse{ #3 = 0 \AND \bdorientation = \bdvert} {\rput[tc]{#3}(#1,#2){{#4}}} {\rput[r]{#3}(#1,#2){{#4}}} } %-------------------------------------------------------------------- % \InputIfFileExists{bardiag.cfg} {\typeout{BarDiag: Local configuration file bardiag.cfg loaded}} {\typeout{BarDiag: No local configuration loaded}} % %--------------------------------------------------------------------