diff options
Diffstat (limited to 'usergrps/uktug/baskervi/6_2/spqr/piechart.sh')
-rw-r--r-- | usergrps/uktug/baskervi/6_2/spqr/piechart.sh | 364 |
1 files changed, 364 insertions, 0 deletions
diff --git a/usergrps/uktug/baskervi/6_2/spqr/piechart.sh b/usergrps/uktug/baskervi/6_2/spqr/piechart.sh new file mode 100644 index 0000000000..626305fa19 --- /dev/null +++ b/usergrps/uktug/baskervi/6_2/spqr/piechart.sh @@ -0,0 +1,364 @@ +#! /bin/sh + +# -*- Mode: Ksh -*- +# piecharts.sh --- Creation of pie charts in (La)TeX + PostScript, +# with PSTricks +# Author : Denis GIROU (CNRS/CIRCE - France) <girou@circe.fr> +# Created the : Fri Oct 16 21:53:41 1992 +# Last mod. by : Denis GIROU (CNRS/CIRCE - France) <girou@circe.fr> +# Last mod. the : Tue Jan 26 21:15:55 1993 +# Version : 2.2 +# +# Description : piecharts.sh is a simple SHELL and AWK program to +# realize hight quality, greatly customizable, grayscaled +# or colored pie charts in PostScript. +# It uses (La)TeX and the splendid PSTricks package of +# Timothy Van Zandt <tvz@princeton.edu>, available in +# /anonymous@princeton.edu:/pub +# It creates the (La)TeX (+ PSTricks) code for direct +# insertion in a (La)TeX document of the pie chart generated. +# It use a data file which describe the parts and the labels +# for them. +# You always can modify the generated code for more +# personal and sophisticated result. +# +# Syntax : piecharts.sh [scale_factor] ([PLAIN] | [FIGURE] [BOXIT]) \ +# <data_file >output_file +# Default scale factor is 1. +# Default mode is LaTeX. In this case, use the FIGURE +# option if you want to define the figure LaTeX environment +# for the pie chart, and use the BOXIT option if you want +# a box around this figure. +# Use the PLAIN option if you want to generate a plain TeX +# code (in this case, you cannot used the FIGURE and BOXIT +# options). +# +# Input file : The fill styles are: none, solid, vlines, vlines*, +# hlines, hlines*, crosshatch, crosshatch* +# The predefined colors are : black, darkgray, gray, +# lightgray, white, red, green, blue, cyan, magenta, yellow +# You can easily define new gray or colors, or access to a +# rgb palette with the palette.sty file of PSTricks. +# You can also change a lot of parameters. See the +# documentation of PSTricks for more customization. +# +# Input file format: You can add blanks lines and comments (beginning by #). +# The default field separator is | You can change it at +# the AWK level. +# The first non-comment line has 3 fields for titles +# (only the first is required), and after you must have one +# line by part of the pie chart, with 5 or 6 fields each +# (percentage, inside label, outside label, filling, color, +# explode). The last one is optional and must be "yes" if +# you want that this part will be explode in the pie chart. +# Obviously, the total of the percentages must be 100, or +# less. +# You can add (La)TeX commands in the labels (\em, \small, +# etc.), and separate lines by \\ in LaTeX and \cr in TeX. +# The text attributes cannot act on multiple lines : you +# must type {\em Paris}\\{\em France} for example in LaTeX. +# Be careful of some (La)TeX special characters (see $ +# and % in the examples). +# Here are two examples, using a LaTeX syntax (suppress +# the first 2 characters of each line): +# +# # Data for the first example of pie charts +# +# # Title of the figure | Title for the table of figures | Label +# Example 1 of pie chart +# +# # Value | Inside label | Outside label | Type of | Color +# # | filling | fill +# 20 | \small\$9.0M | {\em Paris}\\{\em France} | hlines | black +# 35 | \small\$16.7M | {\em London}\\Great Britain | vlines | black +# 45 | {\small\$23.1M}\\1991 | {\em Berlin}\\Germany | crosshatch | black +# +# +# # Data for the second example of pie charts +# +# # Title of the figure | Title for the table of figures | Label +# \bf Example 2 of pie chart | Pie Chart 2 | piechart2 +# +# # Value | Inside | Outside label | Type of | Color of | Explode part +# # | label | | filling | filling | +# 2 | | 2\% \\ Last | solid | red | yes +# 28 | | 28\% | solid | blue +# 4 | | 4\% | solid | green +# 47 | | 47\% \\ First | solid | magenta | yes +# 19 | | 19\% | solid | cyan +# +# +# Examples : If you name these files piechart1.dat and piechart2.dat, +# you can simply type: +# piecharts.sh 1.5 <piechart1.dat >piechart1.tmp +# piecharts.sh 0.7 figure boxit <piechart2.dat >pie2.tmp +# and just insert the two result files in a LaTeX document +# at the right place... +# There are no difference if you want to produce plain TeX +# code. You only must put valid plain TeX commands in the +# data files. +# +# Portability : Expected great. Tested on RS6000 under AIX 3.2 and +# DECStation 3100 under Ultrix 4.3 +# +# Known problems : - Obviously, take care of the labels for the small +# parts. If they are too long or in a too big font, the +# result will not be pretty... +# - You must have the LANG environment variable to En_US +# if your UNIX has the National Language Support (NLS) +# (by instance, amusing problems arrive with LANG=Fr_FR ...) +# +# Thanks : Timothy Van Zandt for the great work of PSTricks, tests +# and ideas for the plain TeX mode. +# +# History : (10/16/92) - rev. 1.0 +# (10/20/92) - rev. 1.1: +# * increase the portability by suppression of the usage +# of the sub builtin function of AWK +# * better tracking of blank/null and comments lines +# (12/04/92) - rev. 2.0: +# * increase the portability by transformation of the +# unique AWK program in a SHELL script calling an +# AWK program : +# - the program is renamed form piecharts.awk to +# piecharts.sh +# - input data file now given as parameter, not as +# standard input +# - the parameters are obtained in the SHELL script +# - the options (SCALE, FIGURE and BOXIT) are now +# treated by post-processing the AWK output file by +# SED (ugly but it's because some AWK versions +# doesn't accept the definition of external +# variables...) +# * change the unit for the values of the parts +# from fractions of 360 degrees to percentages +# * definition of the figure environment now optional, +# using the FIGURE option +# * new possibility to declare some explode parts in the +# piechart +# * use of the new \uput PSTricks macro for easy +# treatment of explode parts +# * possibility to have multiple (centered) line labels +# (inside and outside labels) +# * better tracking of syntax errors in the command line +# (12/11/92) - rev. 2.1: +# * generation of the tabular environment for labels only +# if they have multi-lines +# * the comment lines which begin with the ## are copied +# (without the ##) at the beginning of the result file. +# This allow automatic generation of input data file +# with a good specification of the colors, by automatic +# generation of the \newgray commands. It's to work in +# conjonction with the piecharts-data.sh script. +# * input data file read on the standard input +# * diminution of the width of the minipage to avoid +# the "overfull \hbox" problems +# * change the test of the sum of percentages from 100 to +# 100.0001, because it can occurs problem with 100... +# (01/26/93) - rev. 2.2: +# * suppression of lines longer than 78 characters +# * change the obsolete \Polar PSTricks order to +# \SpecialCoor +# * add the PLAIN option and the possibility to generate +# plain TeX code + + +# Interpretation of the parameters +if [ $# -gt 3 ] + then echo "You cannot give more than 3 parameters." + echo "Syntax: piecharts.sh [scale factor] ([PLAIN] | [FIGURE] \ +[BOXIT]) <data_file >out_file" + exit +fi + +SCALE=1 +FIGURE="xx" +BOXIT="xx" +TEX="LATEX" +while [ $# -ne 0 ] + do if [ $1 = "BOXIT" ] || [ $1 = "boxit" ] + then BOXIT="BOXIT" + elif [ $1 = "FIGURE" ] || [ $1 = "figure" ] + then FIGURE="FIGURE" + elif [ $1 = "PLAIN" ] || [ $1 = "plain" ] + then TEX="PLAIN" + else SCALE=$1 + fi + shift +done + +# Verifications for the plain TeX mode +if [ $TEX = "PLAIN" ] && [ $BOXIT = "BOXIT" ] + then echo "You cannot give the BOXIT parameter in PLAIN TEX mode." + exit +fi +if [ $TEX = "PLAIN" ] && [ $FIGURE = "FIGURE" ] + then echo "You cannot give the FIGURE parameter in PLAIN TEX mode." + exit +fi + +# Beginning of the AWK program +awk ' +BEGIN{FS="|" # Fields separator + PARAM="NO" + BEGIN_VALUE=0 + END_VALUE=0 + TOTAL_PERCENT=0 + # Definition of a figure environment (if FIGURE is not use, this line + # will be remove later - ugly but it is because some AWK versions does + # not accept the definition of external variables...) + # if FIGURE + print "%figure\\begin{figure}[htbp]" + # Framebox around the figure, (if BOXIT is not use, this line will be + # remove later) + # if BOXIT + print "%boxit \\psframebox[framesep=8mm]{" + print "%latex {\\addtolength{\\textwidth}{-2.3cm}" + print "%latex \\begin{minipage}{\\textwidth}" + print "%latex \\begin{center}" + # if FIGURE + print "%figure \\vspace{6mm}" + print "%latex {\\setlength{\\tabcolsep}{0cm}" + print "%tex {%" + print " \\psset{unit=cm,xunit=cm,yunit=cm}" + print "%latex \\begin{pspicture}(-2,-2)(2,2)" + print " \\SpecialCoor" + print "%tex \\pspicture(-2,-2)(2,2)" + print "%tex \\def\\PieLabel\#1{\\vbox{\\halign{\\hfil\#\#"\ +"\\hfil\\cr\#1\\cr}}}%" + print " \\psset{framesep=1.5pt}" + } + +{ + # Suppression of the right and left blanks of the variables + for (I=1;I<=NF+1;I++) { + # On the left... + for (J=1;J<=length($I)+1;J++) + if (substr($I,1,1) == " ") + $I=substr($I,2) + else + break + # On the right... + for (J=length($I);J>0;J--) + if (substr($I,J,1) == " ") + $I=substr($I,1,J-1) + else + break + } + + # Special comments before title (beginning by ##): they are copied + # at the beginning of the result file, without the ## + if (substr($1,1,2) == "##") + print substr($1,3,length($1)) + + # Comments, null and blank lines + if (substr($1,1,1) == "#" || $1 == "" || $1 == " ") + break + + if (PARAM == "NO") { + # Generic parameters: title, title for the table of figures, label + # (the last two are optional) + PARAM="YES" + TITLE=$1 + TABLE_TITLE=$2 + LABEL=$3} + else { + # Verification of the sum of the parts + TOTAL_PERCENT=TOTAL_PERCENT+$1 + if (TOTAL_PERCENT > 100.0001) { + print "Error! Total of percentages greater than 100! (" \ + TOTAL_PERCENT ")" + exit} + # Transformation of percentages in fractions of 360 degrees + $1=$1*3.6 + END_VALUE=END_VALUE+$1 + VAL=BEGIN_VALUE+$1/2 + #Explode part + if ($6 == "YES" || $6 == "yes") + print " \\uput{0.3}[" VAL "](0;0){" + print " \\pswedge[fillstyle=" $4 ",fillcolor=" $5 "]{2}{" \ + BEGIN_VALUE "}{" END_VALUE "}" + # Inside label + if ($2 != "") { + print "%tex \\rput(1.2;" VAL "){\\psframebox*{\\PieLabel{" \ +$2 "}}}" + if (index($2,"\\\\") == 0) + print "%latex \\rput(1.2;" VAL "){\\psframebox*{" $2 "}}" + else { + print "%latex \\rput(1.2;" VAL \ + "){\\psframebox*{\\begin{tabular}{c}" + print "%latex " $2 + print "%latex \\end{tabular}}}" + } + } + # Outside label + if ($3 != "") { + print "%tex \\uput{2.2}[" VAL "](0;0){\\PieLabel{" $3 "}}" + if (index($3,"\\\\") == 0) + print "%latex \\uput{2.2}[" VAL "](0;0){" $3 "}" + else { + print "%latex \\uput{2.2}[" VAL "](0;0){\\begin{tabular}{c}" + print "%latex " $3 + print "%latex \\end{tabular}}" + } + } + # End of explode treatment + if ($6 == "YES" || $6 == "yes") + print " }" + BEGIN_VALUE=END_VALUE} + $1="" +} + +END{ + print "%latex \\end{pspicture}" + print "%tex \\endpspicture" + print " }" + # For the case of a multiple line outside label at the bottom... + # if FIGURE + print "%figure \\vspace{4mm}" + print "%latex \\end{center}" + # if FIGURE + if (TABLE_TITLE == "") + print "%figure \\caption{" TITLE "}" + else + print "%figure \\caption[" TABLE_TITLE "]{" TITLE "}" + if (LABEL != "") + print "%figure \\label{f:" LABEL "}" + print "%latex \\end{minipage}" + print "%latex }" + # if BOXIT + print "%boxit }" + # if FIGURE + print "%figure\\end{figure}" + }' >/tmp/piechart.tmp + +# Post-processing for the "scale factor", PLAIN, FIGURE and BOXIT parameters +# (ugly but it's because some AWK versions doesn't accept the definition +# of external variables...) +if [ $FIGURE = "FIGURE" ] + then sed -e /unit=/s/unit=/unit=$SCALE/g -e /\^%figure/s/// \ + /tmp/piechart.tmp >/tmp/piechart.tmp2 + else sed -e /unit=/s/unit=/unit=$SCALE/g -e /\^%figure/d \ + /tmp/piechart.tmp >/tmp/piechart.tmp2 +fi +mv /tmp/piechart.tmp2 /tmp/piechart.tmp +if [ $BOXIT = "BOXIT" ] + then sed -e /\^%boxit/s/// /tmp/piechart.tmp >/tmp/piechart.tmp2 + else sed -e /\^%boxit/d /tmp/piechart.tmp >/tmp/piechart.tmp2 +fi + +# plain TeX or LaTeX mode +mv /tmp/piechart.tmp2 /tmp/piechart.tmp +if [ $TEX = "LATEX" ] + then sed -e /\^%tex/d /tmp/piechart.tmp >/tmp/piechart.tmp2 + mv /tmp/piechart.tmp2 /tmp/piechart.tmp + sed -e /\^%latex/s/// /tmp/piechart.tmp >/tmp/piechart.tmp2 + else sed -e /\^%latex/d /tmp/piechart.tmp >/tmp/piechart.tmp2 + mv /tmp/piechart.tmp2 /tmp/piechart.tmp + sed -e /\^%tex/s/// /tmp/piechart.tmp >/tmp/piechart.tmp2 +fi + +# Deliver of the result! +cat /tmp/piechart.tmp2 + +rm /tmp/piechart.tmp /tmp/piechart.tmp2 |