LaTeX/barchart/barchart.sty

171 lines
5.2 KiB
Plaintext
Raw Permalink Normal View History

2014-05-20 21:36:19 +02:00
% this is my first package
%
% (c) Frederik Vanggaard
%
% Inspired by bchart version 0.1.2 by Tobias Kuhn
%
%% 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.
%
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{barchart}
[2014/05/19 v0.01 LaTeX package for bar charts]
\usepackage{tikz}
\usepackage{ifthen}
\usetikzlibrary{calc}
\newlength{\barcpos}
\newcommand{\tempWidth}{}
% barchart args:
% #1: max
% #2: min
% #3: steps
% #4: step
% #5: width
% #7: height
% #8: scale
% #9: axis label
\newcommand{\barcmin}{}
\newcommand{\barcmax}{}
\newcommand{\barcsteps}{}
\newcommand{\barcstep}{}
\newlength{\barctotalWidth}
\newcommand{\ypos}{}
\newcommand{\scale}{}
\newcommand{\barcy}{}
\makeatletter
\define@key{barchart}{min}{\renewcommand{\barcmin}{#1}}
\define@key{barchart}{max}{\renewcommand{\barcmax}{#1}}
\define@key{barchart}{steps}{\renewcommand{\barcsteps}{#1}}
\define@key{barchart}{step}{\renewcommand{\barcstep}{#1}}
\define@key{barchart}{width}{\setlength{\barctotalWidth}{#1}}
\define@key{barchart}{height}{\renewcommand{\ypos}{#1}}
\define@key{barchart}{scale}{\renewcommand{\scale}{#1}}
\define@key{barchart}{label}{\renewcommand{\barcy}{#1}}
\makeatother
%barc args:
% #1: color
% #2: width
% #3: plain (true/false)
% #4: label
% #5: rotation (true/false)
\newcommand{\barccolor}{}
\newcommand{\barcwidth}{}
\newcommand{\barcplain}{}
\newcommand{\barclabel}{}
\newcommand{\barcrotation}{}
\makeatletter
\define@key{barc}{color}{\renewcommand{\barccolor}{#1}}
\define@key{barc}{width}{\renewcommand{\barcwidth}{#1}}
\define@key{barc}{plain}[false]{\renewcommand{\barcplain}{true}}
\define@key{barc}{label}{\renewcommand{\barclabel}{#1}}
\define@key{barc}{rotation}[false]{\renewcommand{\barcrotation}{true}}
\makeatother
%skip args:
% #1: size
\newcommand{\barcskiplabel}{}
\makeatletter
\define@key{barcskip}{label}{\renewcommand{\barcskiplabel}{#1}}
\makeatother
\newenvironment{barchart}[1][]{%
\newcommand{\barc}[2][] {%
\renewcommand{\barccolor}{blue!20}
\renewcommand{\barcwidth}{30pt}
\renewcommand{\barcplain}{false}
\renewcommand{\barclabel}{}
\renewcommand{\barcrotation}{false}
\addtolength{\barcpos}{5mm}
\setkeys{barc}{##1}
%\fill[color=\barccolor,fill,draw](\barcpos,0) rectangle (\barcwidth+\barcpos,##2);
\fill[color=\barccolor, fill,draw](\barcpos,0) rectangle ($##2-\barcmin*(0,\barcrange/\barcrange) + (\barcwidth+\barcpos-5mm,0)$);
\draw (\barcpos,0) rectangle ($##2-\barcmin*(0,\barcrange/\barcrange) + (\barcwidth+\barcpos-5mm,0)$);
%\node[draw, shape=circle,fill,\barccolor] at (\barcpos+\barcwidth-5mm,0){};
%\node[draw, shape=circle,fill,\barccolor] at ($##2-\barcmin*(0,\barcrange/\barcrange) + (\barcwidth+\barcpos-5mm,0)$){##2};
\ifthenelse{\equal{\barcplain}{true}}{}{
% Write value:
%\node[anchor=east] at ($(\barcpos+(\barcwidth/3,0) + (0,##2+0.5)$){##2};
% $##2-\bcmin*(\bcwidth/\bcrange,0) + (0,\bcpos-2.5mm)$
\node[] at ($($##2-\barcmin*(0,\barcrange/\barcrange) + (\barcwidth+\barcpos-5mm,0)$)!0.5!(\barcpos,##2+0.25+\barcmax/10) $){##2};
}
\ifthenelse{\equal{\barcrotation}{true}}{false}{
\node[label={[label distance=0.5cm,text depth=-1ex,rotate=-90]right:\barclabel}] at ($($\barcmin*(0,\barcrange/\barcrange) + (\barcwidth+\barcpos-5mm,0)$)!0.5!(\barcpos,1.5) $) {};
}
\ifthenelse{\equal{\barcrotation}{false}}{true}{
2014-05-23 20:31:59 +02:00
\node[label={[label distance=0.5cm,text depth=-1ex,rotate=-45]right:\barclabel}] at ($($\barcmin*(0,\barcrange/\barcrange) + (\barcwidth+\barcpos-15mm,0)$)!0.5!(\barcpos,1) $) {};
2014-05-20 21:36:19 +02:00
}
\addtolength{\barcpos}{\dimexpr(\barcwidth-20pt) \relax}
}
\newcommand{\barcskip}[2][]{
\renewcommand{\barcskiplabel}{}
\setkeys{barcskip}{##1}
\addtolength{\barcpos}{##2}
}
\renewcommand{\barcmin}{0}
\renewcommand{\barcmax}{10}
\renewcommand{\barcstep}{1}
\renewcommand{\ypos}{1em}
\renewcommand{\scale}{1}
\renewcommand{\smallskip}[1][]{\barcskip[##1]{2.5mm}}
\renewcommand{\medskip}[1][]{\barcskip[##1]{5.0mm}}
\renewcommand{\bigskip}[1][]{\barcskip[##1]{7.5mm}}
2014-05-26 13:46:45 +02:00
\newcommand{\barcrange}{\barcstripunit{\dimexpr\barcmax pt-\barcmin pt\relax}}
2014-05-20 21:36:19 +02:00
\renewcommand{\barcstep}{\barcrange}
\renewcommand{\barcsteps}{0,\barcstep,...,\barcrange}%
\setkeys{barchart}{#1}
\begin{tikzpicture}[y=\ypos, scale = \scale]
} {
\draw (0,0) -- (\barcpos+\barcwidth,0);
\draw (0,0) -- ($(0,(\barcmax-\barcmin)$);
\draw (0,0) -- (0-1mm,0);
2014-05-26 13:46:45 +02:00
\node[anchor=east] (n) at (0-1mm,0) {\barcstripunit{\dimexpr\barcmin pt\relax}};
2014-05-20 21:36:19 +02:00
\coordinate (labelpos) at (n.east);
\foreach \x in \barcsteps {
\ifthenelse{\equal{\x}{0}}{}{
\draw ($\x*(0,\barcmax/\barcrange) + (0,0)$) -- ($\x*(0,\barcmax/\barcrange) + (0-1mm,0)$);
2014-05-26 13:46:45 +02:00
\node[anchor=east] at (-1mm,\x){\barcstripunit{\dimexpr\barcmin pt+\x pt\relax}};
2014-05-20 21:36:19 +02:00
}
}
\ifthenelse{\equal{\barcy}{}}{}{
%\node[label={[label distance=0.5cm,align=center,text depth=-1ex,rotate=-90]left:\barcy}] at ($(-0.75,\barcmax) !0.5! (0,\barcmin)$){};
2014-05-23 20:31:59 +02:00
\node[rotate=-90] at ($(-1.25-\barcmax/100,\barcmax) !0.5! (0,\barcmin)$){\barcy};
2014-05-20 21:36:19 +02:00
}
\end{tikzpicture}%
}
\makeatletter
2014-05-26 13:46:45 +02:00
\newcommand*{\barcstripunit}[1]{\strip@pt#1}
2014-05-20 21:36:19 +02:00
\makeatother
%%
%% End of file `barchart.sty'.