diff options
author | Karl Berry <karl@freefriends.org> | 2009-05-18 18:21:01 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2009-05-18 18:21:01 +0000 |
commit | 9ec59a52efe9f9a4e9dbdfb47f893f66e718ab69 (patch) | |
tree | 2ff54e57fd58a4a817db491a90d15766d8595736 /Master | |
parent | 6b60829e5501e746c1a35a55b1e4883dea9665cd (diff) |
new latex package ulqda (15may09)
git-svn-id: svn://tug.org/texlive/trunk@13209 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rw-r--r-- | Master/texmf-dist/doc/latex/ulqda/README | 42 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/ulqda/ulqda.pdf | bin | 0 -> 285144 bytes | |||
-rwxr-xr-x | Master/texmf-dist/scripts/ulqda/ulqda.pl | 252 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/ulqda/Makefile | 35 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/ulqda/ulqda.dtx | 1742 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/ulqda/ulqda.sty | 245 | ||||
-rwxr-xr-x | Master/tlpkg/bin/tlpkg-ctan-check | 3 | ||||
-rwxr-xr-x | Master/tlpkg/libexec/ctan2tds | 3 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/collection-science.tlpsrc | 1 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/ulqda.tlpsrc | 2 |
10 files changed, 2324 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/latex/ulqda/README b/Master/texmf-dist/doc/latex/ulqda/README new file mode 100644 index 00000000000..fc4939e5d0a --- /dev/null +++ b/Master/texmf-dist/doc/latex/ulqda/README @@ -0,0 +1,42 @@ +ulqda - A LaTeX package supporting Qualitative Data Analysis + +Copyright (C) 2009 by Ivan Griffin (ivan.griffin@ul.ie) + +This file may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either +version 1.2 of this license or (at your option) any later +version. The latest version of this license is in: + + http://www.latex-project.org/lppl.txt + +and version 1.2 or later is part of all distributions of +LaTeX version 1999/12/01 or later. + +ulqda is a LaTeX package for use in Qualitative Data Analysis research. +It supports the integration of Qualitative Data Analysis (QDA) research tasks, +specifically for Grounded Theory, into the LaTeX work flow. + +It assists in the analysis of textual data such as interview transcripts +and field notes by providing the LaTeX user with macros which +are used to markup textual information - for example, in-depth +interviews - in order to facilitate the distillation of emerging +themes from the data in a consistent and reliably manner, and to +support visualization of these themes. + +ulqda requires the use of pdfeTeX. The following LaTeX packages, +available on http://www.ctan.org/ are needed by the ulqda +package: + * soul.sty + * color.sty + * multicols.sty + * PGF/TikZ + * dot2texi.sty + +In addition, the following external tools are required for processing +and graph/list generation: + * GraphViz (http://www.graphviz.org) + * dot2tex (http://www.fauskes.net/code/dot2tex/} + * Perl and the Digest::SHA1 module + +I have tested the package on Fedora running TeX Live 2008 and on +Windows 7 running MiKTeX. diff --git a/Master/texmf-dist/doc/latex/ulqda/ulqda.pdf b/Master/texmf-dist/doc/latex/ulqda/ulqda.pdf Binary files differnew file mode 100644 index 00000000000..33d100a42f1 --- /dev/null +++ b/Master/texmf-dist/doc/latex/ulqda/ulqda.pdf diff --git a/Master/texmf-dist/scripts/ulqda/ulqda.pl b/Master/texmf-dist/scripts/ulqda/ulqda.pl new file mode 100755 index 00000000000..9590ac8368e --- /dev/null +++ b/Master/texmf-dist/scripts/ulqda/ulqda.pl @@ -0,0 +1,252 @@ +#!/usr/bin/perl +# +# Helper Perl script for ulqda +# A LaTeX package supporting Qualitative Data Analysis +# +# Copyright (C) 2009 by Ivan Griffin +# +# This file may be distributed and/or modified under the +# conditions of the LaTeX Project Public License, either +# version 1.2 of this license or (at your option) any later +# version. The latest version of this license is in: +# +# http://www.latex-project.org/lppl.txt +# +# and version 1.2 or later is part of all distributions of +# LaTeX version 1999/12/01 or later. +# + +use Getopt::Long; +use Digest::SHA1 qw(sha1 sha1_hex sha1_base64); + +sub Display_Version() +{ + print "Version: ulqda.pl [2009/05/15 v1.0 Qualitative Data Analysis package]\n\n"; + exit; +} + +sub Display_Usage() +{ + print<<"EOF"; +Usage: $0 <--list>|<--graphflat>|<--graphnet>|<--help>|<--version> \\ + [<--filter section>] [<--number-->] infile.csv outfile + +--filter: filter based on document section label +--graphflat: Generate GraphViz .dot output of codes (unconnected) +--graphnet: Generate GraphViz .dot output of codes (connected) +--help: Print this help and exit +--list: Generate LaTeX table of codes (labelled as table:qda_codes) +--number: Output quantity details +--version: Dispaly version information +EOF + exit; +} + +sub sort_codes_hashvalue_descending { + $codes{$b} <=> $codes{$a}; +} + +@colors = ("#d40000", "#e35a24", "#f67c00", "#faa800", "#ffc000", "#ffde00", "#aae900", "#62dc68", "#bbcced", "#a3bbe0", "#8aaad4", "#7299c7", "#5676b5", "#4554a3", "#2e3191", "#000472"); + +$result = GetOptions("number" => \$options{'n'}, + "list" => \$options{'l'}, + "graphflat" => \$options{'g'}, + "filter=s" => \$options{'f'}, + "graphnet" => \$options{'G'}, + "version" => \$options{'v'}, + "help" => \$options{'h'}); + +&Display_Usage() if !$result; +&Display_Usage() if $options{'h'}; + +&Display_Version() if $options{'v'}; + +if (!($options{'l'} || $options{'g'} || $options{'G'})) +{ + print "Requires one of --list, --graphflat, --graphnet, --version or --help\n\n"; + &Display_Usage() +} + +if (($ARGV[0]) && ($ARGV[1])) +{ + open(FILEIN, "<$ARGV[0]") or die "Could not open input file $ARGV[0]\n"; + open(FILEOUT, ">$ARGV[1]") or die "Could not open output file $ARGV[1]\n"; +} +else +{ + &Display_Usage(); +} + +if ($options{'l'}) +{ + print FILEOUT << "EOF"; +{ +\\vspace{0.1in} +\\hrule + +\\begin{multicols}{3} +\\label{table:qda_codes} +EOF +} +elsif ($options{'g'} || $options{'G'}) +{ + print FILEOUT << "EOF"; +digraph codes { +overlap=scale +ratio=compress +smoothType=spring +repulsiveforce=1.2 +splines=true + +# +# Nodes +# +EOF +} + +<FILEIN>; # gobble first line (it is just header) + +# now, for each line, parse into comma separated values +# codes are further split based on the '!' separator character +# e.g. risk!business becomes two codes, risk and business, with a +# connection between risk->business +GOBBLE_LOOP: while (<FILEIN>) +{ + chomp; + ($page, $section, $code_list, $text) = split(/\,/, $_, 4); +#print"DEBUG: >>$code_list<< $_ \n"; + + if (($options{'f'}) && ($options{'f'} != $section)) + { + # filtering selected so if no match, then skip + next GOBBLE_LOOP; + } + + foreach $code ( split(/\!/, $code_list) ) + { + $code =~ s/^ //g; + $codes{$code} += 1; + } + + @connections = (@connections, $code_list); +} +close(FILEIN); + +# +# Find the maximum number of connections and the minimum number of connections +# This will be used for scaling subsequently +# +$iterationCount = 0; $nodeCount = 0; +$maxConnections = 0; $minConnections=65535; + +LOOP: foreach $i (sort sort_codes_hashvalue_descending keys %codes) +{ + if ($codes{$i} > $maxConnections) { $maxConnections = $codes{$i} } + if ($codes{$i} < $minConnections) { $minConnections = $codes{$i} } +} + +# +# For each code, output it as requested +# +foreach $i (sort sort_codes_hashvalue_descending keys %codes) +{ + $digest = sha1_hex($i); + + if ($options{'l'} && ($iterationCount)) + { + print FILEOUT "\\\\\n"; + } + elsif ($options{'g'} || $options{'G'}) + { + $nodeCount++; + print FILEOUT "Node$digest [label=\""; + } + + $i =~ s/!/:/g; + print FILEOUT "$i"; + + if ($options{'n'}) + { + print FILEOUT "{\\textcolor{red}{" if ($options{'l'}); + print FILEOUT "($codes{$i})"; + print FILEOUT "}}" if ($options{'l'}); + } + + $fontSize = 15 + ((60 * $codes{$i})/$maxConnections); + + if ($options{'g'} || $options{'G'}) + { + print FILEOUT "\", fontsize=$fontSize"; + #if ($iterationCount <= 5) + { + # heatmap based colors + # $colorIndex = 6 - int((6*($codes{$i} - $minConnections))/($maxConnections - $minConnections)); + # index based colors + $colorIndex = int(($iterationCount*16)/(keys %codes)); + print FILEOUT ",color=\"$colors[$colorIndex]\",style=filled"; + } + print FILEOUT "]\n"; + } + elsif (! $options{'l'} ) + { + print FILEOUT "\n"; + } + $iterationCount++; +} + +# +# For connection graphs, process each connection between points +# +if ($options{'G'}) +{ + print FILEOUT <<"EOF"; + +# +# Connections +# +EOF + + for $code_list (@connections) + { + print FILEOUT "// $code_list\n"; + @code_list_array = split(/\!/, $code_list); + $previous_code = shift(@code_list_array); + $previous_code =~ s/^ //g; + + if (defined($previous_code)) + { + foreach $code ( @code_list_array ) + { + $code =~ s/^ //g; + $previous_digest = sha1_hex($previous_code); + $digest = sha1_hex($code); + + # ensure only 1 connection between points + if (!defined($connection{"$previous_digest-$digest"})) + { + $connection{"$previous_digest-$digest"} = 1; + $len=0.25+(0.75*$codes{$previous_code}/$maxConnections); + $w=0.25+(0.75*$codes{$previous_code}/$maxConnections); + print FILEOUT "Node$previous_digest->Node$digest [label=\"\", w=$w, len=$len]\n"; + } + + $previous_code = $code; + } + } + } +} + +# +# Tidy up +# +if ($options{'l'}) +{ + print FILEOUT << "EOF"; +\\end{multicols} +\\hrule +EOF +} + +print FILEOUT "\n}\n"; + +close(FILEOUT); diff --git a/Master/texmf-dist/source/latex/ulqda/Makefile b/Master/texmf-dist/source/latex/ulqda/Makefile new file mode 100644 index 00000000000..0582a4f1da9 --- /dev/null +++ b/Master/texmf-dist/source/latex/ulqda/Makefile @@ -0,0 +1,35 @@ +# +# Makefile for ulqda.dtx +# A LaTeX package supporting Qualitative Data Analysis +# +# Copyright (C) 2009 by Ivan Griffin +# +# This file may be distributed and/or modified under the +# conditions of the LaTeX Project Public License, either +# version 1.2 of this license or (at your option) any later +# version. The latest version of this license is in: +# +# http://www.latex-project.org/lppl.txt +# +# and version 1.2 or later is part of all distributions of +# LaTeX version 1999/12/01 or later. +# + +all: ulqda.sty ulqda.pdf + +ulqda.sty ulqda.pdf: ulqda.dtx + pdflatex ulqda.dtx + makeindex -s gind.ist ulqda.idx + makeindex -s gglo.ist -o ulqda.gls ulqda.glo + pdflatex ulqda.dtx + pdflatex ulqda.dtx + +ulqda.dvi: ulqda.dtx + latex ulqda.dtx + makeindex -s gind.ist ulqda.idx + makeindex -s gglo.ist -o ulqda.gls ulqda.glo + latex ulqda.dtx + latex ulqda.dtx + +clean: + -${RM} texput.log ulqda.aux ulqda.csv ulqda.glo ulqda.idx ulqda.ilg ulqda.ind ulqda.log ulqda.pdf ulqda.sty ulqda.out ulqda.toc ulqda.dvi ulqda.pl ulqda.ins ulqda.gls diff --git a/Master/texmf-dist/source/latex/ulqda/ulqda.dtx b/Master/texmf-dist/source/latex/ulqda/ulqda.dtx new file mode 100644 index 00000000000..741f79c42ea --- /dev/null +++ b/Master/texmf-dist/source/latex/ulqda/ulqda.dtx @@ -0,0 +1,1742 @@ +% \iffalse meta-comment +%<*batchfile> +%% +%% ulQda +%% A LaTeX package supporting Qualitative Data Analysis +%% +%% Copyright (C) 2009 by Ivan Griffin +%% +%% This file may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.2 of this license or (at your option) any later +%% version. The latest version of this license is in: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% and version 1.2 or later is part of all distributions of +%% LaTeX version 1999/12/01 or later. +\begingroup +\input docstrip.tex +\keepsilent +\usedir{tex/latex/ulqda} +\preamble + +This is a generated file. + +Copyright (C) 2009 by Ivan Griffin + +This file may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either +version 1.2 of this license or (at your option) any later +version. The latest version of this license is in: + + http://www.latex-project.org/lppl.txt + +and version 1.2 or later is part of all distributions of +LaTeX version 1999/12/01 or later. + +\endpreamble +\askforoverwritefalse +\generate{\file{ulqda.sty}{\from{ulqda.dtx}{package}}} +\generate{\usepreamble\empty \usepostamble\empty \file{ulqda.pl}{\from{ulqda.dtx}{perl}}} +\endgroup +%</batchfile> +%<*package> +% +% +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesPackage{ulqda} + [2009/05/15 v1.0 Qualitative Data Analysis package] +% +%</package> +%<*driver> +\documentclass{ltxdoc} +\usepackage{color} +\usepackage{soul} +\definecolor{UlQda@lightblue}{rgb}{0.80,0.85,1} +\sethlcolor{UlQda@lightblue} +\usepackage{tikz} +\usetikzlibrary{backgrounds,shapes,arrows,positioning} +\usepackage{alltt} +\usepackage{ulqda} +\usepackage{hyperref} +\usepackage{subfigure} +\definecolor{linkcolour}{rgb}{0,0.2,0.6} +\hypersetup{colorlinks,breaklinks, + linkcolor=linkcolour,citecolor=linkcolour, + filecolor=linkcolour, urlcolor=linkcolour} +\GetFileInfo{ulqda.sty} +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\newenvironment{UsageEnv} +{ + % Begin Code + \vspace*{0.12em} + \textsc{Usage}: +} +{ + % End Code + \\ \vspace*{0.25em} +} +\def\TikZ{Ti{\em k}Z} +\begin{document} +\DocInput{ulqda.dtx} +\end{document} +%</driver> +% \fi +% +% \CheckSum{363} +% \changes{v1.0}{2009/05/15}{Initial Version} +% \GetFileInfo{ulqda.sty} +% +% \title{\ulQda: A \LaTeX\ package supporting Qualitative Data Analysis} +% \author{Ivan Griffin +% \\% +% \texttt{ivan.griffin@ul.ie}} +% \date{\filedate} +% \maketitle +% +% ^^A The following were copied verbatim from source2e.tex. +% \DoNotIndex{\def,\long,\edef,\xdef,\gdef,\let,\global} +% \DoNotIndex{\if,\ifnum,\ifdim,\ifcat,\ifmmode,\ifvmode,\ifhmode,% +% \iftrue,\iffalse,\ifvoid,\ifx,\ifeof,\ifcase,\else,\or,\fi} +% \DoNotIndex{\box,\copy,\setbox,\unvbox,\unhbox,\hbox,% +% \vbox,\vtop,\vcenter} +% \DoNotIndex{\@empty,\immediate,\write} +% \DoNotIndex{\egroup,\bgroup,\expandafter,\begingroup,\endgroup} +% \DoNotIndex{\divide,\advance,\multiply,\count,\dimen} +% \DoNotIndex{\relax,\space,\string} +% \DoNotIndex{\csname,\endcsname,\@spaces,\openin,\openout,% +% \closein,\closeout} +% \DoNotIndex{\catcode,\endinput} +% \DoNotIndex{\jobname,\message,\read,\the,\m@ne,\noexpand} +% \DoNotIndex{\hsize,\vsize,\hskip,\vskip,\kern,\hfil,\hfill,\hss} +% \DoNotIndex{\m@ne,\z@,\z@skip,\@ne,\tw@,\p@} +% \DoNotIndex{\dp,\wd,\ht,\vss,\unskip,} +% +% ^^A The following are for this package. +% \DoNotIndex{\begin,\day,\time,\year,\month,\par,\hl,\hbadness,\typeout} +% \DoNotIndex{\input,\lower,\index,\emph,\RequirePackage} +% \DoNotIndex{\it,\protect,\sethlcolor,\setkeys,\stepcounter,\thepage,\thesection,\tiny,\ul,\verb,\tmpfile} +% +% \begin{abstract} +% \ulQda\ is a \LaTeX\ package for use in Qualitative Data Analysis research. +% It assists in the analysis of textual data such as interview transcripts +% and field notes. This document corresponds to \ulQda~\fileversion, +% dated~\filedate. +% \end{abstract} +% +% \tableofcontents +% +% \section{Introduction} +% This document describes \ulQda, a \LaTeX\ package which supports +% the integration of Qualitative Data Analysis (QDA) research tasks, +% specifically for Grounded Theory, into the +% \LaTeX\ work flow. For a quick start example, see +% section~\ref{sect:example}. +% +% \subsection{What is Qualitative Data Analysis?} +% Qualitative Data Analysis is a field of inquiry that is popular in +% social science research~\cite{miles_and_huberman}. +% Scientific methods within QDA aim to gain +% comprehensive and holistic understandings of the motivations for +% human behaviour in many different situations. +% +% Grounded Theory is a qualitative methodology that emphasises the +% generation of new theory from its natural emergency through the +% process of continual collection, compaction and analysis~\cite{glaser_strauss,strauss_corbin}. +% +% \subsection{What does this package do?} +% +% The \ulQda\ package provides the \LaTeX\ user with macros which +% are used to markup textual information - for example, in-depth +% interviews - in order to facilitate the distillation of emerging +% themes from the data in a consistent and reliably manner, and to +% support visualisation of these themes. +% +% In order words, the package lets the computer do the grunt work, and +% the researcher focus on recognising and comprehending the +% emerging theories from the work. +% +% The package works by creating a comma-separate values (CSV) cache file +% of the codes and associated text it finds in your \LaTeX\ source. +% It then post-processes this CSV file to +% \href{http://www.graphviz.org}{GraphViz} Dot language, and +% uses \texttt{dot2texi.sty} to optionally render this data as graphs. +% The filename for the CSV file is generated automatically from the +% \LaTeX\ current jobname. +% +% \subsection{Why is this package named \ulQda?} +% The name \ulQda\ is simply the initials of my \emph{alma mater}, the +% \href{http://www.ul.ie/}{University of Limerick}, prepended onto the +% abbreviation QDA to generate a unique name. The \ulQda\ prefix is used +% within the package on macro names and conditionals to prevent naming +% clashes. +% +% \subsection{Acknowledgements} +% Special thanks to Marc van Dongen and Peter Flynn of the +% \href{https://listserv.heanet.ie/cgi-bin/wa?A0=ITALIC-L}% +% {Irish \TeX{} and \LaTeX{} In-Print Community} +% for their assistance in creating the \LaTeX\ macro to perform the coding. +% Thanks also to Kjell Magne Fauskes for the excellent \texttt{dot2tex} and +% \texttt{dot2texi.sty} packages. +% +% \subsection{Legal Mumbo-Jumbo} +% +% This document and the \ulQda\ package are copyright \copyright~2009 +% Ivan Griffin. +% +% The \ulQda\ package may be distributed under the +% conditions of the \LaTeX\ Project Public License, either +% version 1.2 of this license or (at your option) any later +% version. The latest version of this license is in: +% \begin{quote} +% \url{http://www.latex-project.org/lppl.txt} +% \end{quote} +% and version 1.2 or later is part of all distributions of +% \LaTeX\ version 1999/12/01 or later. +% +% \section{Prerequisites} +% \ulQda\ requires the use of pdfe\TeX. The following \LaTeX\ packages, +% available on \href{http://www.ctan.org/}{CTAN}, are needed by the \ulQda\ +% package: +% \begin{itemize} +% \item soul.sty - provides letter-spacing and underlining; +% \item color.sty - provides \LaTeX\ support for colour; +% \item multicols.sty - defines an environment for typesetting text in +% multiple columns; +% \item \href{http://sourceforge.net/projects/pgf/}{PGF/\TikZ} - macro +% package for the creation of graphics in \TeX; +% \item \href{http://www.fauskes.net/nb/introducing-dot2texi/}{dot2texi.sty} - allows the embedding of GraphViz graphs (described in Dot language) in \LaTeX\ documents. +% \end{itemize} +% +% In addition, the following external tools are required for processing +% and graph/list generation: +% \begin{itemize} +% \item \href{http://www.graphviz.org/}{GraphViz} is a tool to automate +% graph visualisation~\cite{graphviz}, a means of graphically +% `representing structural information as diagrams of abstract graphs +% and networks'; +% \item \href{http://www.fauskes.net/code/dot2tex/}{dot2tex} is a tool +% for converting graphs generated by GraphViz to PGF/\TikZ\ that can +% be rendered with \LaTeX~\cite{dot2tex}; +% \item \href{http://www.perl.org/}{Perl} and the Digest::SHA1 Perl Module +% are used to automate the conversion of coded output to Dot language. +% \end{itemize} +% +% \section{Why use \LaTeX\ for QDA Automation?} +% +% An obvious question at this point is why use \LaTeX\ for QDA work flow +% automation? Surely there are plenty of commercial offerings on the +% market that can perform the same or similar task? +% +% In my opinion, incorporating the coding markup into the \LaTeX\ +% typesetting flow has a number of benefits: +% +% \begin{itemize} +% \item it helps keep coding near the data - developer Brad Appleton +% describes this well~\cite{locality_of_ref}: +% \begin{quote} +% `\emph{The likelihood of keeping all or part of a software +% artifact consistent with any corresponding text that describes it, +% is inversely proportional to the square of the cognitive distance +% between them.}' +% \end{quote} +% Appleton also expands on the concept of cognitive +% distance~\cite{locality_of_ref}: +% \begin{quote} +% `\emph{The phrase ``out of sight, out of mind'' gives a vague +% indication of what is meant by ``cognitive distance'' \ldots +% it relates to the interruption of ``flow'' +% of the developers' thoughts between the time they first thought of +% what they needed to do, and the time and effort expended before +% they were actually able to begin doing it. }' +% \end{quote} +% \item coding can easily be output as a recorded high-quality typeset +% deliverable - this is possible with other commercial tools, although +% the output is not as aesthetic as using \LaTeX\ - it is certainly more +% difficult to do this with pen, paper and scissors techniques; +% \begin{itemize} +% \item in addition, typesetting the coded data is very valuable - +% it allows others to check the validity of the output (theme +% emergence and theory building) of your work, and provides a resource +% for subsequent (perhaps affiliated) researchers to use (subject to +% confidentiality and disclosure agreements, etc.) +% \item Using \LaTeX\ allows you to easily keep the interviews +% typographically consistent with the styles and notations used in +% the main dissertation; +% \end{itemize} +% \item it allows for a significant degree of flexible in the work flow, +% limited primarily by your imagination, and not by the functionality +% of a commercial package. A \LaTeX\ based scheme can `fit naturally +% into a work flow where there are many tools, each good at its own +% job'\cite{LaTeX_goes_with_the_flow}. +% As the \LaTeX\ typesetting run itself is generating the coded +% output data in an easily accessible format (comma-separated values), +% it is possible to post-process this and visualize the data in a +% number of different ways: +% \begin{itemize} +% \item coupled with an appropriate version control system, the +% \LaTeX\ QDA work flow can provide full traceability of a theme from +% the collection of source interview data, condensation into codes, +% iterative refinement of these codes into orthogonal and related +% sets, and presentation/visualisation of the generated ontologies; +% \item it is possible to generate `heatmaps', mixing qualitative +% analysis with some element of quantitative analysis, and to +% use color coding or font/size scaling based on frequency of +% occurrence of certain codes or themes; +% \item it is also possible to visually recognize saturation +% occurring in emerging themes - again through the use of +% appropriate color coding of new themes on a per-interview +% basis - the output format includes the document section +% information per code to facilitate this post-processing; +% \end{itemize} +% \item this package and the \LaTeX\ typesetting system are freely +% available - you may be unwilling or unable to pay for commercial +% software; +% \end{itemize} +% +% \section{Installation} +% The package \ulQda\ is distributed as \texttt{dtx} archive together +% with a corresponding \texttt{Makefile}. +% \texttt{dtx} files are text files which combines a \LaTeX\ package with +% other helper files and documentation for its own code. +% +% In order to install this package, you must: +% \begin{enumerate} +% \item Run \texttt{make} to use the supplied \texttt{Makefile}. This will +% extract the macro and script files from the \texttt{dtx} +% archive, and it will also generate documentation for the packages +% user interfaced and code: +% When built with \texttt{make}, the following files are generated: +% \begin{itemize} +% \item \texttt{ulqda.pdf} - contains this documentation; +% \item \texttt{ulqda.sty} - contains the actual macro implementations; +% \item \texttt{ulqda.pl} - a helper script to parse the CSV output. +% \end{itemize} +% \item Copy \texttt{ulqda.sty} to either the working directory of your +% current \LaTeX\ project, or to your personal \TeX\ tree. +% For Unix users, the procedure to copy to your personal tree is:\\ +%\verb+$ make+\\ +%\verb+$ mkdir -p ~/texmf/tex/latex/ulqda+\\ +%\verb+$ cp ulqda.sty ~/texmf/tex/latex/ulqda+ +% \item Tell \TeX\ to re-index its directories to enable it to recognize +% the new package:\\ +%\verb+$ texhash ~/texmf+ +% \item Copy \texttt{ulqda.pl} to a directory in your path. Again, for +% Unix users, the procedure to do this is as follows:\\ +%\verb+$ cp ulqda.pl ~/bin+ +% \end{enumerate} +% +% \section{Usage} +% +% We will now look at how the package is used - how to set +% its various options, the macros it provides, and an example of its +% operation. +% +% \subsection{Options} +% +% To use the package in your \LaTeX\ document, insert |\usepackage[...]{foo}| +% in the preamble. There are a number of options which can be passed to the +% package: +% \begin{itemize} +% \item \texttt{active}: The default is inactive. If this option is not +% specified, the \ulQda\ package will be inactive and the document +% will be typeset as if the \ulQda\ package were not loaded, except +% that all macros defined by the package are still legal but only +% the |\ulqdaHighlight| macro has an effect. +% +% This allows final typesetting of the document and for page numbering to +% stabilize before running through for a coding pass. +% The recommendation is to activate for the last two \LaTeX\ passes +% through the document - that way the CSV file is generated once page +% numbering is allowed to settle. To activate +% subsequently, it is possible to invoke \LaTeX\ as follows:\\ +% \verb+$ pdflatex --shell-escape "\PassOptionsToPackage{active}{ulqda}+\\ +% \verb+ \input{filename.tex}"+ +% \item \texttt{cache}/\texttt{nocache}: This is an advanced option +% which controls whether the CSV file is generated or not. +% \item \texttt{debug}: This option enables verbose debug output from +% \ulQda. +% \item \texttt{MiKTeX}: This determines whether +% \href{http://www.miktex.org/}{MiK\TeX} is supported or not. MiK\TeX\ is +% a version of \TeX\ that runs on Microsoft Windows platforms. +% \item \texttt{shell}/\texttt{noshell}: These options control whether an +% attempt will be made to process the coding output file via spawning +% the \texttt{ulqda.pl} script directly, or whether it needs to be run +% explicitly by the user. \texttt{shell} is the default, but it requires +% \texttt{--shell-escape} (\TeX{} Live) or \texttt{--enable-write18} +% (MiK\TeX) as a command line argument to \texttt{latex} to enable it. +% \item \texttt{counts}: This option determines whether code output will +% include occurence counts or not. The default is to not output the counts. +% \end{itemize} +% +% In summary, to ensure correct section/page numbers, set the +% \texttt{active} and leave the cache setting at its default +% (\texttt{nocache}) for each run. It is possible to tweak both of these +% to reduce the processing time, being aware of potential side-effects! +% +% \subsubsection{Advanced Options Usage} +% +% The use of the \texttt{active} and \texttt{cache} options are +% primarily to speed up the process of performing QDA code extraction +% through the \LaTeX\ typesetting flow. Some care is needed with their +% use, and it makes sense to select \texttt{active,nocache} as default +% options until comfortable with the typesetting flow for a particular +% document -- otherwise section numbering/page numbering in the generated +% CSV file may be incorrect. +% +% If this isn't a concern (i.e.~traceability and per-section filtering +% for graph visualisation isn't required), then setting \texttt{active,cache} +% on one pass through \LaTeX\ will give best performance. +% +% If page numbers / section numbers are required, then the appropriate +% use of these options will need to be made as required by the specific +% \LaTeX\ flow being used -- i.e.~enable as appropriate. +% It will need to run like this at least 3 times (once to generate the +% CSV file, once to generate the~.Dot output, and once to import any +% generated figures or tables. +% I suggest integrating something like the following for the last 3 \LaTeX\ +% passes through the source: +% \verb+$ pdflatex --shell-escape "\PassOptionsToPackage{active,nocache}{ulqda}+\\ +% \verb+ \input{filename.tex}"+\\ +% \verb+$ pdflatex --shell-escape "\PassOptionsToPackage{active,cache}{ulqda}+\\ +% \verb+ \input{filename.tex}"+\\ +% \verb+$ pdflatex --shell-escape "\PassOptionsToPackage{active,cache}{ulqda}+\\ +% \verb+ \input{filename.tex}"+\\ +% +% \subsection{Macros} +% \DescribeMacro{\ulqdaCode} +% |\ulqdaCode| is used to assign a code a particular sentence or +% passage of text. Coding is a form of data condensing, where the +% words of the passage are compacted and distilled into as few +% succinct words as possible with the aim of capturing +% the essence or theme of the passage. +% +% |\ulqdaCode| takes a list of codes as a first parameter, and the raw +% text as its second. It invokes |\ulqdaHighlight| in order to +% format the passage for typesetting purposes, and outputs the +% code, page number, section number, and raw text to the CSV file - +% one line per code. +% +% The list of codes is a comma separated list; code hierarchies and +% connections can be expressed by chaining codes together using the +% exclamation mark - for example, `\texttt{geographical!urgency}' +% would indicate a relationship between the code `\texttt{geographical}' +% and the code `\texttt{urgency}'. \\ +% \begin{UsageEnv} +% \verb+\ulqdaCode{code1,code2,code3}{Common Text}+ +% \end{UsageEnv} +% +% \DescribeMacro{\ulqdaHighlight} +% |\ulqdaHighlight| is used to format coded text for typesetting +% purposes. By default, it highlights the coded text in a light +% blue color, and it also lists the associated codes in the margin. +% It can be redefined to whatever formatting codes the package user +% requires. \\ +% \begin{UsageEnv} +% \verb+\ulqdaHighlight{code1,code2,code3}{Common Text}+ +% \end{UsageEnv} +% +% \DescribeMacro{\ulqdaGraph} +% |\ulqdaGraph| is a macro which invokes processing of the +% generated CSV file to allow the visualisation of a coded ontology as a +% GraphViz diagram. It take two arguments: +% \begin{itemize} +% \item graph type - this can be either `\texttt{flat}' which is +% an unstructured graph (see figure~\ref{figure:viz:flat}), or +% `\texttt{net}' (see figure~\ref{figure:viz:net}), where the ontology +% relationships are shown as a connected graph; +% \item dot2texi options - this is a list of options that would typically +% be used in a dot2tex environment. Listing these is outside the +% scope of this document, but the following set of options is used +% in the diagrams in this document: +% \verb+neato,mathmode,options={--graphstyle "scale=0.5,transform shape"+. +% \end{itemize} +% \begin{UsageEnv} +% \verb+\ulqdaGraph{+\emph{graph type}\verb+}{+\emph{dot2texi options}\verb+}+ +% \end{UsageEnv} +% +% \DescribeMacro{\ulqdaTable} +% |\ulqdaTable| is a macro which invokes processing of the +% generated CSV file to create a \LaTeX\ table +% (see table~\ref{table:qda_codes}). \\ +% \begin{UsageEnv} +% \verb+\ulqdaTable+ +% \end{UsageEnv} +% +% \DescribeMacro{\ulqdaSetSectFilter} +% |\ulqdaSetSectFilter| establishes a filter for the next |\ulqdaGraph| +% or |\ulqdaTable| macro. If interviews are logically structured in a +% document with each in its own section (or sub-section etc.) then this +% command can be used to establish a filter restricting the graphing or +% table generation to a single interview. \\ +% \begin{UsageEnv} +% \verb+\ulqdaSetSectFilter{+\emph{section label}\verb+}+ +% \end{UsageEnv} +% +% \DescribeMacro{\ulqdaClearSectFilter} +% |\ulqdaClearSectFilter| clears a section filter establihed by +% |\ulqdaSetSectFilter| so that a subsequent |\ulqdaGraph| or a +% |\ulqdaTable| macro will process all sections from the CSV file. \\ +% \begin{UsageEnv} +% \verb+\ulqdaClearSectFilter+ +% \end{UsageEnv} +% +% \subsection{Example}\label{sect:example} +% What follows is an interview excerpt that has been taken through +% the entire flow, i.e.: +% \begin{itemize} +% \item coded; +% \item typeset; and +% \item visualized as a tabular list of codes and also as graphs. +% \end{itemize} +% +% \subsubsection{Coding Example} +% +% First, here is the raw \LaTeX\ source: +% \\ +% \begin{center} +% \framebox{ +% \begin{minipage}{0.95\textwidth} +% \small +% \texttt{$\backslash$textbf\{IG:\} Do you think the social aspect of face}\\ +% \texttt{to face is important for the project? {\ldots}}\\ +% \\ +% \texttt{$\backslash$textbf\{Interviewee\~{}XYZ:\} \ldots{} A cup of coffee is really}\\ +% \texttt{important because then what happens is that you get a}\\ +% \texttt{real perspective. My general experience of having a}\\ +% \texttt{functional group in one site, while I was in the other}\\ +% \texttt{one, working for me and using video conferencing,}\\ +% \texttt{$\backslash$ulqdaCode\{geographical!urgency, geographical!face-eo-face\}\{if you}\\ +% \texttt{really wanted to get things done you had to jump on}\\ +% \texttt{a plane and fly over, there was nothing that could make}\\ +% \texttt{up for sitting in a room with people to both get across}\\ +% \texttt{the urgency and to ensure that communication among}\\ +% \texttt{the team took place to address any of the issues\ldots{}\}} +% \end{minipage} +% }\\ +% \end{center} +% +% +% \subsubsection{Typeset Example} +% Next, we will see what happens when this source is typeset. +% The mainbody text is itself highlighted so that it stands out from +% surrounding text, and the codes are present in the margin. +% \\ +% \begin{center} +% \framebox{ +% \begin{minipage}{0.75\textwidth} +% \textbf{IG:} Do you think the social aspect of face to face is important +% for the project? {\ldots} +% +% \textbf{Interviewee~XYZ:} \ldots{} A cup of coffee is +% really important because then what happens is that you get a real +% perspective. My general experience of having a functional group in one +% site, while I was in the other one, working for me and using video +% conferencing, \hl{\protect\ul{ +% if you really wanted to get things done you had to jump on a +% plane and fly over, there was nothing that could make up for sitting in a +% room with people to both get across the urgency and to ensure that +% communication among the team took place to address any of the +% issues.\ldots{}}} +% \end{minipage} +% \begin{minipage}{0.05\textwidth} +% \end{minipage} +% \begin{minipage}{0.15\textwidth} +% \vfill +% { +% \tiny +% \hl{geographical!urgency, geographical!face-to-face} +% } +% \vfill +% \end{minipage} +% }\\ +% \end{center} +% +% \subsubsection{CSV Cache File} +% The following shows an example of the comma-separated value cache file +% generated for the coded text above. The first line of this file is a +% header and is ignored in processing by the \texttt{ulqda.pl} script. +% \\ +% \begin{center} +% \framebox{ +% \begin{minipage}{0.95\textwidth} +% \small +% \texttt{Page Number, Section, Code, Text\\ +% 2, 0, geographical!urgency, "if you really wanted to get things done you had to jump on a plane and fly over, there was nothing that could make up for sitting in a room with people to both get across the urgency and to ensure that communication among the team took place to address any of the issues\ldots{}"\\ +% 2, 0, geographical!face-to-face, "if you really wanted to get things done you had to jump on a plane and fly over, there was nothing that could make up for sitting in a room with people to both get across the urgency and to ensure that communication among the team took place to address any of the issues\ldots{}"\\ +% } +% \end{minipage} +% }\\ +% \end{center} +% +% \subsubsection{Visualisation as a Table} +% +% Table~\ref{table:qda_codes} illustrates the output from |\ulqdaTable|. +% +% \begin{table}[h] +% \centering +% \caption{List of QDA Codes} +% { +% \vspace{0.1in} +% \hrule +% +% \begin{multicols}{3} +% \label{table:qda_codes} +% geographical\\ +% urgency\\ +% face-to-face +% \end{multicols} +% \hrule +% } +% \end{table} +% +% \subsubsection{Visualisation as Graphs} +% Figure~\ref{figure:viz} shows the visualisation output possible from \ulQda: +% \begin{itemize} +% \item figure~\ref{figure:viz:flat} shows the image created using\\ +% |\ulqdaGraph{net}{neato,mathmode,|\\ +% | options={--graphstyle "scale=0.5,transform shape"}}|. +% \item figure~\ref{figure:viz:net} shows the image created using\\ +% |\ulqdaGraph{flat}{neato,mathmode,|\\ +% | options={--graphstyle "scale=0.5,transform shape"}}| +% \end{itemize} +% +% \newsavebox{\tikzPicSaveBoxA} +% \begin{lrbox}{\tikzPicSaveBoxA} +% \begin{tikzpicture}[>=latex,join=bevel,scale=0.475] +% +% \definecolor{strokecolor}{rgb}{1.0,0.87,0.0}; +% \definecolor{fillcolor}{rgb}{1.0,0.87,0.0}; +% \node (Nodeda9c4808fb21d754e6a31daf84d13bbf43182dc5) at (384bp,42bp) [draw=strokecolor,fill=fillcolor,ellipse] {$urgency$}; +% \definecolor{strokecolor}{rgb}{0.54,0.67,0.83}; +% \definecolor{fillcolor}{rgb}{0.54,0.67,0.83}; +% \node (Node794199e201fec00805136c03a2f6517444e1d073) at (491bp,282bp) [draw=strokecolor,fill=fillcolor,ellipse] {$face-to-face$}; +% \definecolor{strokecolor}{rgb}{0.83,0.0,0.0}; +% \definecolor{fillcolor}{rgb}{0.83,0.0,0.0}; +% \node (Node19a6c32cd6543441c9f5a7d4539e0435a4465c83) at (266bp,162bp) [draw=strokecolor,fill=fillcolor,ellipse] {$geographical$}; +% +% \end{tikzpicture} +% \end{lrbox} +% +% \newsavebox{\tikzPicSaveBoxB} +% \begin{lrbox}{\tikzPicSaveBoxB} +% \begin{tikzpicture}[>=latex,join=bevel,scale=0.475] +% +% \definecolor{strokecolor}{rgb}{1.0,0.87,0.0}; +% \definecolor{fillcolor}{rgb}{1.0,0.87,0.0}; +% \node (Nodeda9c4808fb21d754e6a31daf84d13bbf43182dc5) at (356bp,299bp) [draw=strokecolor,fill=fillcolor,ellipse] {$urgency$}; +% \definecolor{strokecolor}{rgb}{0.54,0.67,0.83}; +% \definecolor{fillcolor}{rgb}{0.54,0.67,0.83}; +% \node (Node794199e201fec00805136c03a2f6517444e1d073) at (217bp,42bp) [draw=strokecolor,fill=fillcolor,ellipse] {$face-to-face$}; +% \definecolor{strokecolor}{rgb}{0.83,0.0,0.0}; +% \definecolor{fillcolor}{rgb}{0.83,0.0,0.0}; +% \node (Node19a6c32cd6543441c9f5a7d4539e0435a4465c83) at (266bp,181bp) [draw=strokecolor,fill=fillcolor,ellipse] {$geographical$}; +% \draw [->] (Node19a6c32cd6543441c9f5a7d4539e0435a4465c83) ..controls (240bp,108bp) and (238bp,101bp) .. (Node794199e201fec00805136c03a2f6517444e1d073); +% \draw [->] (Node19a6c32cd6543441c9f5a7d4539e0435a4465c83) ..controls (317bp,247bp) and (318bp,249bp) .. (Nodeda9c4808fb21d754e6a31daf84d13bbf43182dc5); +% +% \end{tikzpicture} +% \end{lrbox} +% +% \begin{figure}[h] +% \centering +% \subfigure[Flat Graph] +% { +% \fbox{\usebox{\tikzPicSaveBoxA}} +% \label{figure:viz:flat} +% } +% \hspace{0.5cm} +% \subfigure[Hierarchical Graph with Connections] +% { +% \fbox{\usebox{\tikzPicSaveBoxB}} +% \label{figure:viz:net} +% } +% \caption{Visualisation through GraphViz} +% \label{figure:viz} +% \end{figure} +% +% Figure~\ref{figure:complex} shows a more complex visualisation generated from +% a more comprehensive set of coding. +% +% +% \newsavebox{\tikzPicSaveBoxComplex} +% \begin{lrbox}{\tikzPicSaveBoxComplex} +% \begin{tikzpicture}[>=latex,join=bevel,scale=0.11,transform shape] +% \definecolor{strokecolor}{rgb}{0.64,0.73,0.88}; +% \definecolor{fillcolor}{rgb}{0.64,0.73,0.88}; +% \node (Node11907eb81526a671b74e000ef5abaffc932081ec) at (2584bp,1925bp) [draw=strokecolor,fill=fillcolor,ellipse] {$new platform$}; +% \definecolor{strokecolor}{rgb}{0.54,0.67,0.83}; +% \definecolor{fillcolor}{rgb}{0.54,0.67,0.83}; +% \node (Node24da2349705267e0db51531c0958413a9556e1a4) at (3277bp,2001bp) [draw=strokecolor,fill=fillcolor,ellipse] {$SW influence on System Arch$}; +% \definecolor{strokecolor}{rgb}{0.83,0.0,0.0}; +% \definecolor{fillcolor}{rgb}{0.83,0.0,0.0}; +% \node (Node19a6c32cd6543441c9f5a7d4539e0435a4465c83) at (2540bp,875bp) [draw=strokecolor,fill=fillcolor,ellipse] {$geographical$}; +% \definecolor{strokecolor}{rgb}{0.45,0.6,0.78}; +% \definecolor{fillcolor}{rgb}{0.45,0.6,0.78}; +% \node (Node0284c6ac58cb47bb52e427007beee58e0132bf71) at (2255bp,2459bp) [draw=strokecolor,fill=fillcolor,ellipse] {$tools$}; +% \definecolor{strokecolor}{rgb}{0.38,0.86,0.41}; +% \definecolor{fillcolor}{rgb}{0.38,0.86,0.41}; +% \node (Nodeffddae94a489d364c14bfa0bc20509be9bbd52cd) at (2192bp,1739bp) [draw=strokecolor,fill=fillcolor,ellipse] {$resource requirements$}; +% \definecolor{strokecolor}{rgb}{0.73,0.8,0.93}; +% \definecolor{fillcolor}{rgb}{0.73,0.8,0.93}; +% \node (Node857a3f01adebeadc2e3233e182485ad98fa4808b) at (2992bp,817bp) [draw=strokecolor,fill=fillcolor,ellipse] {$telecoms$}; +% \definecolor{strokecolor}{rgb}{0.73,0.8,0.93}; +% \definecolor{fillcolor}{rgb}{0.73,0.8,0.93}; +% \node (Nodee5ddf0cf596bc85b1d76e20d573522ab30c52dde) at (2696bp,3435bp) [draw=strokecolor,fill=fillcolor,ellipse] {$ambition$}; +% \definecolor{strokecolor}{rgb}{0.18,0.19,0.57}; +% \definecolor{fillcolor}{rgb}{0.18,0.19,0.57}; +% \node (Node6c912f1b9ece5fbfec963302cf1a6fcc1f72b641) at (2224bp,2906bp) [draw=strokecolor,fill=fillcolor,ellipse] {$early prototype$}; +% \definecolor{strokecolor}{rgb}{1.0,0.87,0.0}; +% \definecolor{fillcolor}{rgb}{1.0,0.87,0.0}; +% \node (Node6bee1484bea1868299e58f40683ab3093d319d44) at (94bp,1678bp) [draw=strokecolor,fill=fillcolor,ellipse] {$fluid specifications$}; +% \definecolor{strokecolor}{rgb}{0.54,0.67,0.83}; +% \definecolor{fillcolor}{rgb}{0.54,0.67,0.83}; +% \node (Node13308f22bf33c24028a7196eaf01645c5dc63056) at (3361bp,2311bp) [draw=strokecolor,fill=fillcolor,ellipse] {$moving SW into HW$}; +% \definecolor{strokecolor}{rgb}{0.96,0.49,0.0}; +% \definecolor{fillcolor}{rgb}{0.96,0.49,0.0}; +% \node (Node0c18da7ce026bae350e071f9c9892f47854755f8) at (2269bp,3106bp) [draw=strokecolor,fill=fillcolor,ellipse] {$market window$}; +% \definecolor{strokecolor}{rgb}{0.98,0.66,0.0}; +% \definecolor{fillcolor}{rgb}{0.98,0.66,0.0}; +% \node (Node0dbe529c4dfad996667815f32902cb3a2b94c94f) at (2922bp,1310bp) [draw=strokecolor,fill=fillcolor,ellipse] {$social$}; +% \definecolor{strokecolor}{rgb}{0.18,0.19,0.57}; +% \definecolor{fillcolor}{rgb}{0.18,0.19,0.57}; +% \node (Noded1c21a4e5a354fe40e70739ba19c1ffda65b3e90) at (1884bp,3479bp) [draw=strokecolor,fill=fillcolor,ellipse] {$consumer electronics$}; +% \definecolor{strokecolor}{rgb}{0.34,0.46,0.71}; +% \definecolor{fillcolor}{rgb}{0.34,0.46,0.71}; +% \node (Node7febc4b16f23adf0fbe705a72b1e920a5f79d8e4) at (2485bp,20bp) [draw=strokecolor,fill=fillcolor,ellipse] {$team building$}; +% \definecolor{strokecolor}{rgb}{0.67,0.91,0.0}; +% \definecolor{fillcolor}{rgb}{0.67,0.91,0.0}; +% \node (Node12f73a5a4f409d241325ddb50d658c993327e9d7) at (2183bp,1175bp) [draw=strokecolor,fill=fillcolor,ellipse] {$overconfidence$}; +% \definecolor{strokecolor}{rgb}{1.0,0.87,0.0}; +% \definecolor{fillcolor}{rgb}{1.0,0.87,0.0}; +% \node (Node546a0042646239cb2b8f5a48ede17044a7ef1890) at (2236bp,3563bp) [draw=strokecolor,fill=fillcolor,ellipse] {$changing market requirements$}; +% \definecolor{strokecolor}{rgb}{1.0,0.75,0.0}; +% \definecolor{fillcolor}{rgb}{1.0,0.75,0.0}; +% \node (Node11e9ba26c91a2db7452a5ef9ff7051e19b6b377a) at (2614bp,2520bp) [draw=strokecolor,fill=fillcolor,ellipse] {$schedule$}; +% \definecolor{strokecolor}{rgb}{0.45,0.6,0.78}; +% \definecolor{fillcolor}{rgb}{0.45,0.6,0.78}; +% \node (Node957782c35eec7c1b95eaa3e080b7aa97d7d641d9) at (2317bp,3716bp) [draw=strokecolor,fill=fillcolor,ellipse] {$competitive analysis$}; +% \definecolor{strokecolor}{rgb}{0.73,0.8,0.93}; +% \definecolor{fillcolor}{rgb}{0.73,0.8,0.93}; +% \node (Nodeccabe2fccfc9d7d6adf8e0c37a8f794e0f70b66e) at (879bp,1144bp) [draw=strokecolor,fill=fillcolor,ellipse] {$cost of changing HW$}; +% \definecolor{strokecolor}{rgb}{1.0,0.87,0.0}; +% \definecolor{fillcolor}{rgb}{1.0,0.87,0.0}; +% \node (Node1e7fceb82d739fd04658161f3e37ad7f866b317f) at (284bp,1371bp) [draw=strokecolor,fill=fillcolor,ellipse] {$fluid requirements$}; +% \definecolor{strokecolor}{rgb}{0.45,0.6,0.78}; +% \definecolor{fillcolor}{rgb}{0.45,0.6,0.78}; +% \node (Node797efd83f8c15deef7f4d4762a8c92d8b5a9305f) at (2242bp,1365bp) [draw=strokecolor,fill=fillcolor,ellipse] {$implementation$}; +% \definecolor{strokecolor}{rgb}{0.96,0.49,0.0}; +% \definecolor{fillcolor}{rgb}{0.96,0.49,0.0}; +% \node (Node2d5665952d74d765d3aad8ab414f96fe4dc51db9) at (2544bp,320bp) [draw=strokecolor,fill=fillcolor,ellipse] {$importance of face to face$}; +% \definecolor{strokecolor}{rgb}{0.89,0.35,0.14}; +% \definecolor{fillcolor}{rgb}{0.89,0.35,0.14}; +% \node (Node9fa7f61fda21f51c481ba3721c0f072e33d2abc0) at (2103bp,3328bp) [draw=strokecolor,fill=fillcolor,ellipse] {$business model$}; +% \definecolor{strokecolor}{rgb}{0.98,0.66,0.0}; +% \definecolor{fillcolor}{rgb}{0.98,0.66,0.0}; +% \node (Node925b4271c1d7533eb2d3cb2154cfec4eb06734cf) at (730bp,1710bp) [draw=strokecolor,fill=fillcolor,ellipse] {$changeability of SW$}; +% \definecolor{strokecolor}{rgb}{1.0,0.87,0.0}; +% \definecolor{fillcolor}{rgb}{1.0,0.87,0.0}; +% \node (Nodec339980f75d565d568bed4943192f865402a85e2) at (3032bp,574bp) [draw=strokecolor,fill=fillcolor,ellipse] {$techno-geographical split$}; +% \definecolor{strokecolor}{rgb}{0.64,0.73,0.88}; +% \definecolor{fillcolor}{rgb}{0.64,0.73,0.88}; +% \node (Node70ef4adb6243a8757f5ac77a5cae9a726f406b98) at (2771bp,549bp) [draw=strokecolor,fill=fillcolor,ellipse] {$visibility$}; +% \definecolor{strokecolor}{rgb}{0.83,0.0,0.0}; +% \definecolor{fillcolor}{rgb}{0.83,0.0,0.0}; +% \node (Node60944e5702bdafb74ec9614120a88bdfa7084da0) at (2909bp,2152bp) [draw=strokecolor,fill=fillcolor,ellipse] {$technical$}; +% \definecolor{strokecolor}{rgb}{0.18,0.19,0.57}; +% \definecolor{fillcolor}{rgb}{0.18,0.19,0.57}; +% \node (Noded69683190ac95b492b7f1c19873463ff73c222fd) at (3372bp,1536bp) [draw=strokecolor,fill=fillcolor,ellipse] {$web tools$}; +% \definecolor{strokecolor}{rgb}{0.38,0.86,0.41}; +% \definecolor{fillcolor}{rgb}{0.38,0.86,0.41}; +% \node (Nodeb99f24955c90296fabf855bb4d54929a3fef70e1) at (1384bp,3260bp) [draw=strokecolor,fill=fillcolor,ellipse] {$HW fear of risk$}; +% \definecolor{strokecolor}{rgb}{0.0,0.02,0.45}; +% \definecolor{fillcolor}{rgb}{0.0,0.02,0.45}; +% \node (Node74d940dd3e717faa542bf612d28ec2542b71e963) at (3409bp,2124bp) [draw=strokecolor,fill=fillcolor,ellipse] {$communiction$}; +% \definecolor{strokecolor}{rgb}{0.98,0.66,0.0}; +% \definecolor{fillcolor}{rgb}{0.98,0.66,0.0}; +% \node (Node0172079aee21a5d804c9c2bd1ddb9261cfebb67e) at (739bp,2387bp) [draw=strokecolor,fill=fillcolor,ellipse] {$lack of mixed design skills$}; +% \definecolor{strokecolor}{rgb}{0.83,0.0,0.0}; +% \definecolor{fillcolor}{rgb}{0.83,0.0,0.0}; +% \node (Node11a110bbef1bcc07ee6b72c48ab5c5b21afbab91) at (1533bp,2059bp) [draw=strokecolor,fill=fillcolor,ellipse] {$risk$}; +% \definecolor{strokecolor}{rgb}{0.83,0.0,0.0}; +% \definecolor{fillcolor}{rgb}{0.83,0.0,0.0}; +% \node (Node4ab18acd3552592a0877a68a8e1c3494f03de7e5) at (2853bp,2659bp) [draw=strokecolor,fill=fillcolor,ellipse] {$HW vs SW$}; +% \definecolor{strokecolor}{rgb}{0.27,0.33,0.64}; +% \definecolor{fillcolor}{rgb}{0.27,0.33,0.64}; +% \node (Node9dc7651df0059af282ea6decf914838ca28b8d42) at (948bp,2914bp) [draw=strokecolor,fill=fillcolor,ellipse] {$multi-disciplinary$}; +% \definecolor{strokecolor}{rgb}{0.27,0.33,0.64}; +% \definecolor{fillcolor}{rgb}{0.27,0.33,0.64}; +% \node (Nodef90836d07f1e94806617725784c78e4e89824127) at (3314bp,2923bp) [draw=strokecolor,fill=fillcolor,ellipse] {$mindset gap$}; +% \definecolor{strokecolor}{rgb}{0.89,0.35,0.14}; +% \definecolor{fillcolor}{rgb}{0.89,0.35,0.14}; +% \node (Node8d08946e603eb0277964f9dffb00266975512736) at (2369bp,2085bp) [draw=strokecolor,fill=fillcolor,ellipse] {$complexity$}; +% \definecolor{strokecolor}{rgb}{0.45,0.6,0.78}; +% \definecolor{fillcolor}{rgb}{0.45,0.6,0.78}; +% \node (Node31aa07dda877d5f74de19f680f75d754866e74c6) at (2388bp,490bp) [draw=strokecolor,fill=fillcolor,ellipse] {$perception of other discipline$}; +% \definecolor{strokecolor}{rgb}{0.54,0.67,0.83}; +% \definecolor{fillcolor}{rgb}{0.54,0.67,0.83}; +% \node (Nodea9c032d95328db0ae1261c3c14d81e3a192f41c8) at (3214bp,2421bp) [draw=strokecolor,fill=fillcolor,ellipse] {$project inception$}; +% \definecolor{strokecolor}{rgb}{0.38,0.86,0.41}; +% \definecolor{fillcolor}{rgb}{0.38,0.86,0.41}; +% \node (Node7220917c7baf0d5b494b0211e77b5fd59fb11dd7) at (1148bp,3106bp) [draw=strokecolor,fill=fillcolor,ellipse] {$SW is changeable$}; +% \definecolor{strokecolor}{rgb}{0.89,0.35,0.14}; +% \definecolor{fillcolor}{rgb}{0.89,0.35,0.14}; +% \node (Node8f2e7cd784967d6a79abd59093146fb1f82e336d) at (2836bp,3076bp) [draw=strokecolor,fill=fillcolor,ellipse] {$culture$}; +% \definecolor{strokecolor}{rgb}{1.0,0.75,0.0}; +% \definecolor{fillcolor}{rgb}{1.0,0.75,0.0}; +% \node (Node60c58ad2ef34d96fae028f1039fab03dec9eb9a2) at (3052bp,1616bp) [draw=strokecolor,fill=fillcolor,ellipse] {$communication$}; +% \definecolor{strokecolor}{rgb}{0.38,0.86,0.41}; +% \definecolor{fillcolor}{rgb}{0.38,0.86,0.41}; +% \node (Node94fe47c6f608bbd655277e4abb947276a838f03f) at (2501bp,2809bp) [draw=strokecolor,fill=fillcolor,ellipse] {$greatest impact$}; +% \definecolor{strokecolor}{rgb}{1.0,0.75,0.0}; +% \definecolor{fillcolor}{rgb}{1.0,0.75,0.0}; +% \node (Node608cb271bb7fb52c99a1a8e003e0f80f57fb41e1) at (2083bp,1468bp) [draw=strokecolor,fill=fillcolor,ellipse] {$hardware$}; +% \definecolor{strokecolor}{rgb}{0.67,0.91,0.0}; +% \definecolor{fillcolor}{rgb}{0.67,0.91,0.0}; +% \node (Node179d813443470b5b4f03fae7eb20a074374b8749) at (3245bp,381bp) [draw=strokecolor,fill=fillcolor,ellipse] {$importance of cross-functional skills$}; +% \definecolor{strokecolor}{rgb}{0.27,0.33,0.64}; +% \definecolor{fillcolor}{rgb}{0.27,0.33,0.64}; +% \node (Node982d46d22d9597c30d79d368dc9197f5f1fe5956) at (2049bp,2167bp) [draw=strokecolor,fill=fillcolor,ellipse] {$management$}; +% \definecolor{strokecolor}{rgb}{0.73,0.8,0.93}; +% \definecolor{fillcolor}{rgb}{0.73,0.8,0.93}; +% \node (Node5e705951b3b2e85110d0d9edbca689b733f70893) at (1520bp,1353bp) [draw=strokecolor,fill=fillcolor,ellipse] {$methodology$}; +% \definecolor{strokecolor}{rgb}{0.27,0.33,0.64}; +% \definecolor{fillcolor}{rgb}{0.27,0.33,0.64}; +% \node (Nodea8488a1ffe30feefab69c6c99b92d74d6c36cf8d) at (2496bp,2311bp) [draw=strokecolor,fill=fillcolor,ellipse] {$underestimate learning curve$}; +% \definecolor{strokecolor}{rgb}{0.96,0.49,0.0}; +% \definecolor{fillcolor}{rgb}{0.96,0.49,0.0}; +% \node (Node0998cfed6ab699469c4465f74e75ec25367429d2) at (1865bp,3201bp) [draw=strokecolor,fill=fillcolor,ellipse] {$specialisation$}; +% \definecolor{strokecolor}{rgb}{0.18,0.19,0.57}; +% \definecolor{fillcolor}{rgb}{0.18,0.19,0.57}; +% \node (Nodedf14d801e4a359538f6a17654a1214fbc660c5ea) at (2153bp,490bp) [draw=strokecolor,fill=fillcolor,ellipse] {$informal communication$}; +% \definecolor{strokecolor}{rgb}{0.34,0.46,0.71}; +% \definecolor{fillcolor}{rgb}{0.34,0.46,0.71}; +% \node (Node65279e1ecf00d0d1177a5b3b458fd187a1d6135e) at (784bp,2685bp) [draw=strokecolor,fill=fillcolor,ellipse] {$verification$}; +% \definecolor{strokecolor}{rgb}{0.96,0.49,0.0}; +% \definecolor{fillcolor}{rgb}{0.96,0.49,0.0}; +% \node (Noded13b43f47c02e2d62f12116b4d6f2da47c8b0604) at (2184bp,866bp) [draw=strokecolor,fill=fillcolor,ellipse] {$mitigation$}; +% \definecolor{strokecolor}{rgb}{0.0,0.02,0.45}; +% \definecolor{fillcolor}{rgb}{0.0,0.02,0.45}; +% \node (Nodeb6e2fb5d60ebce8f644ef0eda9117caf6060247e) at (199bp,2027bp) [draw=strokecolor,fill=fillcolor,ellipse] {$inadequate testing$}; +% \definecolor{strokecolor}{rgb}{0.67,0.91,0.0}; +% \definecolor{fillcolor}{rgb}{0.67,0.91,0.0}; +% \node (Nodec2e2d6621334dc890bbd8a69430012c45a83bf65) at (1384bp,1373bp) [draw=strokecolor,fill=fillcolor,ellipse] {$process$}; +% \definecolor{strokecolor}{rgb}{0.34,0.46,0.71}; +% \definecolor{fillcolor}{rgb}{0.34,0.46,0.71}; +% \node (Node0165688353ca81071fdec1551c4ab96a2db65e88) at (3094bp,3367bp) [draw=strokecolor,fill=fillcolor,ellipse] {$confidence$}; +% \definecolor{strokecolor}{rgb}{0.54,0.67,0.83}; +% \definecolor{fillcolor}{rgb}{0.54,0.67,0.83}; +% \node (Nodeb93db90c74e59cca2710bbedbc56911482d72d3d) at (1923bp,1750bp) [draw=strokecolor,fill=fillcolor,ellipse] {$constraints$}; +% \definecolor{strokecolor}{rgb}{0.89,0.35,0.14}; +% \definecolor{fillcolor}{rgb}{0.89,0.35,0.14}; +% \node (Nodec981d125d1a564c9f5738faff51d59d98711f145) at (447bp,1733bp) [draw=strokecolor,fill=fillcolor,ellipse] {$software$}; +% \definecolor{strokecolor}{rgb}{0.64,0.73,0.88}; +% \definecolor{fillcolor}{rgb}{0.64,0.73,0.88}; +% \node (Node4d673c70f72c7f14606e048e062febb769b26b24) at (2081bp,2375bp) [draw=strokecolor,fill=fillcolor,ellipse] {$engineers over-simplify$}; +% \definecolor{strokecolor}{rgb}{1.0,0.75,0.0}; +% \definecolor{fillcolor}{rgb}{1.0,0.75,0.0}; +% \node (Nodedec8c6d379be0cb7cedbbe003f1b1f3671310f5c) at (1870bp,696bp) [draw=strokecolor,fill=fillcolor,ellipse] {$geographical mitigation$}; +% \definecolor{strokecolor}{rgb}{0.0,0.02,0.45}; +% \definecolor{fillcolor}{rgb}{0.0,0.02,0.45}; +% \node (Noded269766c1379693221ae73919ceb24643aab8e13) at (2472bp,3077bp) [draw=strokecolor,fill=fillcolor,ellipse] {$aggressive schedules$}; +% \draw [->] (Node608cb271bb7fb52c99a1a8e003e0f80f57fb41e1) ..controls (2139bp,1432bp) and (2178bp,1407bp) .. (Node797efd83f8c15deef7f4d4762a8c92d8b5a9305f); +% \draw [->] (Node0c18da7ce026bae350e071f9c9892f47854755f8) ..controls (2256bp,3045bp) and (2240bp,2975bp) .. (Node6c912f1b9ece5fbfec963302cf1a6fcc1f72b641); +% \draw [->] (Node11a110bbef1bcc07ee6b72c48ab5c5b21afbab91) ..controls (1256bp,1939bp) and (920bp,1792bp) .. (Node925b4271c1d7533eb2d3cb2154cfec4eb06734cf); +% \draw [->] (Node19a6c32cd6543441c9f5a7d4539e0435a4465c83) ..controls (2497bp,767bp) and (2427bp,589bp) .. (Node31aa07dda877d5f74de19f680f75d754866e74c6); +% \draw [->] (Node8f2e7cd784967d6a79abd59093146fb1f82e336d) ..controls (2800bp,3169bp) and (2734bp,3338bp) .. (Nodee5ddf0cf596bc85b1d76e20d573522ab30c52dde); +% \draw [->] (Node19a6c32cd6543441c9f5a7d4539e0435a4465c83) ..controls (2689bp,784bp) and (2898bp,656bp) .. (Nodec339980f75d565d568bed4943192f865402a85e2); +% \draw [->] (Node60944e5702bdafb74ec9614120a88bdfa7084da0) ..controls (2829bp,2251bp) and (2692bp,2422bp) .. (Node11e9ba26c91a2db7452a5ef9ff7051e19b6b377a); +% \draw [->] (Node8d08946e603eb0277964f9dffb00266975512736) ..controls (2323bp,1994bp) and (2240bp,1834bp) .. (Nodeffddae94a489d364c14bfa0bc20509be9bbd52cd); +% \draw [->] (Node11a110bbef1bcc07ee6b72c48ab5c5b21afbab91) ..controls (1306bp,2249bp) and (922bp,2569bp) .. (Node65279e1ecf00d0d1177a5b3b458fd187a1d6135e); +% \draw [->] (Node11a110bbef1bcc07ee6b72c48ab5c5b21afbab91) ..controls (1868bp,2202bp) and (2404bp,2430bp) .. (Node11e9ba26c91a2db7452a5ef9ff7051e19b6b377a); +% \draw [->] (Node9fa7f61fda21f51c481ba3721c0f072e33d2abc0) ..controls (2145bp,3402bp) and (2192bp,3486bp) .. (Node546a0042646239cb2b8f5a48ede17044a7ef1890); +% \draw [->] (Nodec981d125d1a564c9f5738faff51d59d98711f145) ..controls (550bp,1724bp) and (583bp,1722bp) .. (Node925b4271c1d7533eb2d3cb2154cfec4eb06734cf); +% \draw [->] (Node11a110bbef1bcc07ee6b72c48ab5c5b21afbab91) ..controls (1372bp,2294bp) and (1049bp,2767bp) .. (Node9dc7651df0059af282ea6decf914838ca28b8d42); +% \draw [->] (Node11a110bbef1bcc07ee6b72c48ab5c5b21afbab91) ..controls (1498bp,2347bp) and (1407bp,3072bp) .. (Nodeb99f24955c90296fabf855bb4d54929a3fef70e1); +% \draw [->] (Nodec339980f75d565d568bed4943192f865402a85e2) ..controls (3096bp,517bp) and (3173bp,446bp) .. (Node179d813443470b5b4f03fae7eb20a074374b8749); +% \draw [->] (Node9fa7f61fda21f51c481ba3721c0f072e33d2abc0) ..controls (2156bp,3257bp) and (2213bp,3180bp) .. (Node0c18da7ce026bae350e071f9c9892f47854755f8); +% \draw [->] (Node19a6c32cd6543441c9f5a7d4539e0435a4465c83) ..controls (2751bp,849bp) and (2861bp,834bp) .. (Node857a3f01adebeadc2e3233e182485ad98fa4808b); +% \draw [->] (Node11a110bbef1bcc07ee6b72c48ab5c5b21afbab91) ..controls (1818bp,2193bp) and (2224bp,2383bp) .. (2570bp,2537bp) .. controls (2639bp,2568bp) and (2717bp,2601bp) .. (Node4ab18acd3552592a0877a68a8e1c3494f03de7e5); +% \draw [->] (Node8d08946e603eb0277964f9dffb00266975512736) ..controls (2444bp,2029bp) and (2512bp,1979bp) .. (Node11907eb81526a671b74e000ef5abaffc932081ec); +% \draw [->] (Node8f2e7cd784967d6a79abd59093146fb1f82e336d) ..controls (2908bp,3157bp) and (3022bp,3286bp) .. (Node0165688353ca81071fdec1551c4ab96a2db65e88); +% \draw [->] (Node546a0042646239cb2b8f5a48ede17044a7ef1890) ..controls (2262bp,3612bp) and (2287bp,3658bp) .. (Node957782c35eec7c1b95eaa3e080b7aa97d7d641d9); +% \draw [->] (Nodec981d125d1a564c9f5738faff51d59d98711f145) ..controls (378bp,1814bp) and (269bp,1944bp) .. (Nodeb6e2fb5d60ebce8f644ef0eda9117caf6060247e); +% \draw [->] (Node8d08946e603eb0277964f9dffb00266975512736) ..controls (2340bp,2181bp) and (2285bp,2360bp) .. (Node0284c6ac58cb47bb52e427007beee58e0132bf71); +% \draw [->] (Node60944e5702bdafb74ec9614120a88bdfa7084da0) ..controls (2942bp,2026bp) and (3017bp,1745bp) .. (Node60c58ad2ef34d96fae028f1039fab03dec9eb9a2); +% \draw [->] (Node19a6c32cd6543441c9f5a7d4539e0435a4465c83) ..controls (2429bp,968bp) and (2279bp,1094bp) .. (Node12f73a5a4f409d241325ddb50d658c993327e9d7); +% \draw [->] (Node8d08946e603eb0277964f9dffb00266975512736) ..controls (2289bp,2165bp) and (2162bp,2294bp) .. (Node4d673c70f72c7f14606e048e062febb769b26b24); +% \draw [->] (Node19a6c32cd6543441c9f5a7d4539e0435a4465c83) ..controls (2642bp,991bp) and (2828bp,1203bp) .. (Node0dbe529c4dfad996667815f32902cb3a2b94c94f); +% \draw [->] (Nodeffddae94a489d364c14bfa0bc20509be9bbd52cd) ..controls (2056bp,1744bp) and (2019bp,1746bp) .. (Nodeb93db90c74e59cca2710bbedbc56911482d72d3d); +% \draw [->] (Node60944e5702bdafb74ec9614120a88bdfa7084da0) ..controls (3002bp,2234bp) and (3129bp,2346bp) .. (Nodea9c032d95328db0ae1261c3c14d81e3a192f41c8); +% \draw [->] (Node0c18da7ce026bae350e071f9c9892f47854755f8) ..controls (2364bp,3092bp) and (2376bp,3091bp) .. (Noded269766c1379693221ae73919ceb24643aab8e13); +% \draw [->] (Node60944e5702bdafb74ec9614120a88bdfa7084da0) ..controls (3064bp,2207bp) and (3221bp,2262bp) .. (Node13308f22bf33c24028a7196eaf01645c5dc63056); +% \draw [->] (Node8d08946e603eb0277964f9dffb00266975512736) ..controls (2408bp,2155bp) and (2456bp,2239bp) .. (Nodea8488a1ffe30feefab69c6c99b92d74d6c36cf8d); +% \draw [->] (Node8f2e7cd784967d6a79abd59093146fb1f82e336d) ..controls (2840bp,2979bp) and (2847bp,2791bp) .. (Node4ab18acd3552592a0877a68a8e1c3494f03de7e5); +% \draw [->] (Node60944e5702bdafb74ec9614120a88bdfa7084da0) ..controls (3041bp,2097bp) and (3156bp,2051bp) .. (Node24da2349705267e0db51531c0958413a9556e1a4); +% \draw [->] (Node60944e5702bdafb74ec9614120a88bdfa7084da0) ..controls (3104bp,2141bp) and (3246bp,2133bp) .. (Node74d940dd3e717faa542bf612d28ec2542b71e963); +% \draw [->] (Node11a110bbef1bcc07ee6b72c48ab5c5b21afbab91) ..controls (1359bp,1817bp) and (990bp,1299bp) .. (Nodeccabe2fccfc9d7d6adf8e0c37a8f794e0f70b66e); +% \draw [->] (Node2d5665952d74d765d3aad8ab414f96fe4dc51db9) ..controls (2530bp,244bp) and (2502bp,109bp) .. (Node7febc4b16f23adf0fbe705a72b1e920a5f79d8e4); +% \draw [->] (Node9fa7f61fda21f51c481ba3721c0f072e33d2abc0) ..controls (2011bp,3279bp) and (1954bp,3249bp) .. (Node0998cfed6ab699469c4465f74e75ec25367429d2); +% \draw [->] (Node11a110bbef1bcc07ee6b72c48ab5c5b21afbab91) ..controls (1183bp,1954bp) and (695bp,1807bp) .. (Nodec981d125d1a564c9f5738faff51d59d98711f145); +% \draw [->] (Node608cb271bb7fb52c99a1a8e003e0f80f57fb41e1) ..controls (2109bp,1394bp) and (2153bp,1263bp) .. (Node12f73a5a4f409d241325ddb50d658c993327e9d7); +% \draw [->] (Node19a6c32cd6543441c9f5a7d4539e0435a4465c83) ..controls (2431bp,766bp) and (2248bp,584bp) .. (Nodedf14d801e4a359538f6a17654a1214fbc660c5ea); +% \draw [->] (Noded13b43f47c02e2d62f12116b4d6f2da47c8b0604) ..controls (2090bp,816bp) and (1981bp,756bp) .. (Nodedec8c6d379be0cb7cedbbe003f1b1f3671310f5c); +% \draw [->] (Node11a110bbef1bcc07ee6b72c48ab5c5b21afbab91) ..controls (1687bp,1777bp) and (2078bp,1060bp) .. (Noded13b43f47c02e2d62f12116b4d6f2da47c8b0604); +% \draw [->] (Node11a110bbef1bcc07ee6b72c48ab5c5b21afbab91) ..controls (1706bp,1873bp) and (1972bp,1587bp) .. (Node608cb271bb7fb52c99a1a8e003e0f80f57fb41e1); +% \draw [->] (Node11a110bbef1bcc07ee6b72c48ab5c5b21afbab91) ..controls (1848bp,2069bp) and (2123bp,2078bp) .. (Node8d08946e603eb0277964f9dffb00266975512736); +% \draw [->] (Nodec2e2d6621334dc890bbd8a69430012c45a83bf65) ..controls (1437bp,1365bp) and (1441bp,1365bp) .. (Node5e705951b3b2e85110d0d9edbca689b733f70893); +% \draw [->] (Node11a110bbef1bcc07ee6b72c48ab5c5b21afbab91) ..controls (1257bp,2173bp) and (934bp,2307bp) .. (Node0172079aee21a5d804c9c2bd1ddb9261cfebb67e); +% \draw [->] (Node60c58ad2ef34d96fae028f1039fab03dec9eb9a2) ..controls (3176bp,1585bp) and (3263bp,1563bp) .. (Noded69683190ac95b492b7f1c19873463ff73c222fd); +% \draw [->] (Node60944e5702bdafb74ec9614120a88bdfa7084da0) ..controls (2716bp,2127bp) and (2562bp,2108bp) .. (Node8d08946e603eb0277964f9dffb00266975512736); +% \draw [->] (Node0dbe529c4dfad996667815f32902cb3a2b94c94f) ..controls (2955bp,1386bp) and (3012bp,1522bp) .. (Node60c58ad2ef34d96fae028f1039fab03dec9eb9a2); +% \draw [->] (Node19a6c32cd6543441c9f5a7d4539e0435a4465c83) ..controls (2541bp,741bp) and (2543bp,451bp) .. (Node2d5665952d74d765d3aad8ab414f96fe4dc51db9); +% \draw [->] (Node11a110bbef1bcc07ee6b72c48ab5c5b21afbab91) ..controls (1436bp,2324bp) and (1211bp,2934bp) .. (Node7220917c7baf0d5b494b0211e77b5fd59fb11dd7); +% \draw [->] (Node8d08946e603eb0277964f9dffb00266975512736) ..controls (2243bp,2118bp) and (2161bp,2138bp) .. (Node982d46d22d9597c30d79d368dc9197f5f1fe5956); +% \draw [->] (Nodec981d125d1a564c9f5738faff51d59d98711f145) ..controls (405bp,1639bp) and (329bp,1469bp) .. (Node1e7fceb82d739fd04658161f3e37ad7f866b317f); +% \draw [->] (Node60944e5702bdafb74ec9614120a88bdfa7084da0) ..controls (2895bp,2270bp) and (2869bp,2513bp) .. (Node4ab18acd3552592a0877a68a8e1c3494f03de7e5); +% \draw [->] (Node9fa7f61fda21f51c481ba3721c0f072e33d2abc0) ..controls (2021bp,3385bp) and (1958bp,3428bp) .. (Noded1c21a4e5a354fe40e70739ba19c1ffda65b3e90); +% \draw [->] (Node11e9ba26c91a2db7452a5ef9ff7051e19b6b377a) ..controls (2585bp,2594bp) and (2535bp,2721bp) .. (Node94fe47c6f608bbd655277e4abb947276a838f03f); +% \draw [->] (Node19a6c32cd6543441c9f5a7d4539e0435a4465c83) ..controls (2610bp,776bp) and (2710bp,636bp) .. (Node70ef4adb6243a8757f5ac77a5cae9a726f406b98); +% \draw [->] (Noded13b43f47c02e2d62f12116b4d6f2da47c8b0604) ..controls (2294bp,869bp) and (2343bp,870bp) .. (Node19a6c32cd6543441c9f5a7d4539e0435a4465c83); +% \draw [->] (Nodec981d125d1a564c9f5738faff51d59d98711f145) ..controls (319bp,1713bp) and (240bp,1701bp) .. (Node6bee1484bea1868299e58f40683ab3093d319d44); +% \draw [->] (Node608cb271bb7fb52c99a1a8e003e0f80f57fb41e1) ..controls (2112bp,1539bp) and (2158bp,1654bp) .. (Nodeffddae94a489d364c14bfa0bc20509be9bbd52cd); +% \draw [->] (Node4ab18acd3552592a0877a68a8e1c3494f03de7e5) ..controls (3002bp,2744bp) and (3194bp,2854bp) .. (Nodef90836d07f1e94806617725784c78e4e89824127); +% % +% \end{tikzpicture} +% \end{lrbox} +% +% \begin{figure} +% \centering +% \fbox{\usebox{\tikzPicSaveBoxComplex}} +% \caption{Complex Visualisation of Axial Coding Ontology} +% \label{figure:complex} +% \end{figure} +% +% \pagebreak\clearpage +% \StopEventually{\PrintIndex\PrintChanges} +% +% \section{Implementation} +% \subsection{Dependencies} +% We start be ensuring that the required packages are loaded when this +% file is loaded as a package by \LaTeX{}. +% +% \begin{macrocode} +%<*package> +\RequirePackage{soul} +\RequirePackage{color} +\RequirePackage{multicols} +\RequirePackage{tikz} +\RequirePackage[cache]{dot2texi} +\usetikzlibrary{backgrounds,shapes,arrows,positioning} + +%</package> +% \end{macrocode} +% +% \subsection{Highlighting Style} +% We next setup some default highlighting formatting defines. The user is +% free to change the highlighting formatting through redefining +% |\ulqdaHighlight|. +% \begin{macrocode} +%<*package> +\definecolor{UlQda@lightblue}{rgb}{0.80,0.85,1} +\sethlcolor{UlQda@lightblue} + +%</package> +% \end{macrocode} +% +% \subsection{Package Options} +% \begin{macrocode} +%<*package> +\newif\ifUlQda@debug \UlQda@debugfalse +\newif\ifUlQda@cache \UlQda@cachefalse +\newif\ifUlQda@cachepresent \UlQda@cachepresentfalse +\newif\ifUlQda@shellescape \UlQda@shellescapetrue +\newif\ifUlQda@MiKTeX \UlQda@MiKTeXfalse +\newif\ifUlQda@active \UlQda@activefalse +\newif\ifUlQda@counts \UlQda@countsfalse + +\DeclareOption{active}{\UlQda@activetrue} +\DeclareOption{debug}{\UlQda@debugtrue} +\DeclareOption{cache}{\UlQda@cachetrue} +\DeclareOption{nocache}{\UlQda@cachefalse} +\DeclareOption{shell}{\UlQda@shellescapetrue} +\DeclareOption{noshell}{\UlQda@shellescapefalse} +\DeclareOption{MiKTeX}{\global\UlQda@MiKTeXtrue} +\DeclareOption{counts}{\global\UlQda@countstrue} + +\DeclareOption*{% + \PackageWarning{ulqda}{Unknown option `\CurrentOption'}% +} + +\ExecuteOptions{shell} +\ProcessOptions\relax + +\ifUlQda@counts + \def\UlQda@counts{--number } +\else + \def\UlQda@counts{ } +\fi + +%</package> +% \end{macrocode} +% +% \subsection{Testing the Shell Escape Mechanism} +% Needs to work on both Unix-type platforms and on MiK\TeX{} on Microsoft Windows. +% \begin{macrocode} +%<*package> +%% test if shell escape really works +\ifUlQda@shellescape + \def\tmpfile{/tmp/shellEscapeTest-\the\year\the\month\the\day-\the\time} + \immediate\write18{\ifUlQda@MiKTeX rem >"\tmpfile" \else touch \tmpfile \fi} + \IfFileExists{\tmpfile}{ + \UlQda@shellescapetrue + \immediate\write18{\ifUlQda@MiKTeX del "\tmpfile" \else rm -f \tmpfile \fi} + }{\UlQda@shellescapefalse} +\fi + +\ifUlQda@shellescape + \ifUlQda@debug + \PackageInfo{ulqda}{TeX Shell escape enabled.} + \fi +\else + \PackageWarningNoLine{ulqda} {TeX Shell escape not enabled.\MessageBreak% + Manually process the CSV output with ulqda.pl} +\fi + +%</package> +% \end{macrocode} +% +% \subsection{Active Macro Implementation} +% \begin{macro}{\ulqdaHighlight} +% The most basic macro is a style macro - to format the typeset text, +% indicating that it has been coded, and also to place the codes themselves +% in the margin. +% \begin{macrocode} +%<*package> +\newcommand{\ulqdaHighlight}[2]{% + \hl{\protect\ul{#2}}% + \marginpar% + {\raggedright\hbadness=10000\tiny\it \hl{#1}\par}% + \par% + } + +%</package> +% \end{macrocode} +% \end{macro} +% +% We'll also create |\ulQda|, a vanity macro to typeset the \ulQda\ package name, in +% the \TeX\ tradition. +% +% \begin{macro}{\ulQda} +% \begin{macrocode} +%<*package> +\newcommand{\ulQda}{\textsf{ul\kern -.075em\lower .3ex\hbox {\protect\emph{q}}da}} + +%</package> +% \end{macrocode} +% \end{macro} +% +% Next, we need to determine if the package is intended to be active for +% this \LaTeX\ processing run or not. This is essentially a big switch +% around the majority of the package definitions. +% \begin{macrocode} +%<*package> +\ifUlQda@active +%</package> +% \end{macrocode} +% +% \begin{macro}{\ulqdaCode} +% We now create a macro, |\ulqdaCode| to perform the actual coding of the +% raw text. % This macro, when invoked, will invoke the highlighting +% macro |\ulqdaHighlight| and also conditionally invoke the package private +% macro |\UlQda@ListIt| to output coded text to a comma separate values +% (.csv) cache file. +% +% This is hooked (presently) to \verb+\begin{document}+, and contains some +% conditional code to decide if caching is enabled, and if so, if the cache is +% present or not. +% \begin{macrocode} +% +% +%<*package> + \AtBeginDocument{% + \typeout{ulqda: Loaded - 2009/05/15 v1.0 Qualitative Data Analysis package} +% \end{macrocode} +%</package> +% +% If caching is enabled, the~.csv file will only be generated if necessary. +% This is because the .csv generation can be quick slow - particularly when +% dealing with a number of large portions of text, each having multiple codes. +% \begin{macrocode} +% +%<*package> + \ifUlQda@cache + \IfFileExists{\jobname.csv} % + { + \ifUlQda@debug + \typeout{ulqda: QDA cache file \jobname.csv found} + \fi + \UlQda@cachepresenttrue + } + { + \ifUlQda@debug + \typeout{ulqda: QDA cache file \jobname.csv not found} + \fi + \UlQda@cachepresentfalse + } + \else + \ifUlQda@debug + \typeout{ulqda: caching disabled} + \fi + \UlQda@cachepresentfalse + \fi +%</package> +% \end{macrocode} +% +% Without caching enabled, the~.csv file will be generated every run. +% +% If a cache file is detected and shell escape is enabled, the~.csv cache +% will be processed on demand by |\ulqdaGraph| to generate GraphViz~.dot +% file outputs, and by |\ulqdaTable| to generate a multicolumn list of codes. +% +% In this case, the |\ulqdaCode| macro will not cause the cache file to +% update, but instead will only perform a typesetting function. +% +% \begin{macrocode} +%<*package> + + % Code macro + \ifUlQda@cachepresent + \newcommand{\ulqdaCode}[2]{\ulqdaHighlight{#1}{#2}} +%</package> +% \end{macrocode} +% +% Otherwise, any occurrence of the |\ulqdaCode| macro will update the cache +% file for the run. +% +% \begin{macrocode} +%<*package> + \else + \ifUlQda@debug + \typeout{ulqda: Creating QDA cache file \jobname.csv} % + \fi + \newwrite\ulqdaCodeFile % + \immediate\openout\ulqdaCodeFile=\jobname.csv % + \immediate\write\ulqdaCodeFile{Page Number, Section, Code, Text} % + +%</package> +% \end{macrocode} +% +% The following macro outputs the coding to the code file. +% +% \begin{macrocode} +%<*package> + \def\UlQda@ListIt#1[#2,{% + \ifUlQda@debug % + \typeout{ulqda: Coding "#2" as "#1" on page \thepage, section \thesection} + \fi % + \immediate\write\ulqdaCodeFile{\thepage, \thesection, #2, "#1"} +%</package> +% \end{macrocode} +% +% It also causes the code to be added to the index for the document, which is useful. +% +% \begin{macrocode} +%<*package> + \index{#2} % + \@ifnextchar]% Look ahead one token. + {\eatthesquarebracket}% End of list. + {\UlQda@ListIt{#1}[}% Process rest of list. + } + \def\eatthesquarebracket]{} % Gobble the square bracket. + % + % Coding macro + \newcommand{\ulqdaCode}[2]{\ulqdaHighlight{#1}{#2} \UlQda@ListIt{#2}[#1,]} % + \fi + } % end of \AtBeginDocument + +%</package> +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\ulqdaSetSectFilter} +% |\ulqdaSetSectFilter| enables filtering of CSV processing by +% section label. +% \begin{macrocode} +%<*package> +\newcommand{\UlQda@FirstOfTwo}[1]{ + \ifx#1\UlQda@MyUndefinedMacro + ?\typeout{ulqda: undefined reference, please re-run} + \else + \expandafter\@firstoftwo#1 + \fi} +\newcommand{\UlQda@RefToSectNum}[1]{ + \expandafter \ifx\csname r@#1\endcsname\relax + ?\typeout{ulqda: undefined reference, please re-run} + \else + \expandafter\UlQda@FirstOfTwo\csname r@#1\endcsname + \fi} +%</package> +% \end{macrocode} +% +% Now we start the actual filtering work. First, we delete any old files from +% previous builds. Next, we create a macro which will be used to pass a +% command line argument selecting the appropriate filtering to +% \texttt{ulqda.pl}. +% +% \begin{macrocode} +%<*package> + \def\UlQda@filter{} + \newcommand{\ulqdaSetSectFilter}[1]{ + \ifUlQda@shellescape + \immediate\write18{\ifUlQda@MiKTeX del \else rm -f -- \fi \jobname_net.dot} + \immediate\write18{\ifUlQda@MiKTeX del \else rm -f -- \fi \jobname_flat.dot} + \immediate\write18{\ifUlQda@MiKTeX del \else rm -f -- \fi \jobname_table.tex} + \fi + \def\UlQda@filter{--filter \UlQda@RefToSectNum{#1}} + } +%</package> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ulqdaClearSectFilter} +% +% We also need to be able to clear any previously configured filter, and +% this is what the following macro does for us. +% +% \begin{macrocode} +%<*package> + \newcommand{\ulqdaClearSectFilter}{\def\UlQda@filter{}} +%</package> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ulqdaGraph} +% It is typical to want to present your coded data visually in a number of +% different ways, perhaps focusing on a particular sub-theme if the entire +% ontology is too cumbersome. However, I have provided a sample macro, +% |\ulqdaGraph|, which will support the generation of an overall ontology +% graph through the use of \verb+dot2texi.sty+. +% +% |\ulqdaGraph| uses the power of |\csname| to expand to either +% |\UlQda@GraphNet| or |\UlQda@GraphFlat|, depending on its first argument. +% \begin{macrocode} +%<*package> + \newcommand{\ulqdaGraph}[2]{\expandafter\csname UlQda@Graph#1\endcsname{#2}} + \newcommand\UlQda@Graphflat[1]{\UlQda@GraphFlat{#1}} + \newcommand\UlQda@Graphnet[1]{\UlQda@GraphNet{#1}} + \newcommand{\UlQda@GraphVizFileName}{} + \newsavebox{\UlQda@GraphSaveBox} + \newcommand{\UlQda@GraphNet}[1]{% + \renewcommand{\UlQda@GraphVizFileName}{\jobname_net.dot}% +%</package> +% \end{macrocode} +% +% If a cache file is detected and shell escape is enabled, the~.csv cache +% will be processed on demand by |\UlQda@GraphNet| to generate +% GraphViz~.dot file output. +% +% \begin{macrocode} +%<*package> + \ifUlQda@cachepresent + \ifUlQda@shellescape + \ifUlQda@debug + \typeout{ulqda: Converting .csv to hierarchical GraphViz dot file} + \fi + \immediate\write18{ulqda.pl --graphnet \UlQda@filter \UlQda@counts + -- \jobname.csv \jobname_net.dot} + \fi + \fi + + \UlQda@DoGraph{#1}% + } + \newcommand{\UlQda@GraphFlat}[1]{% + \renewcommand{\UlQda@GraphVizFileName}{\jobname_flat.dot}% +%</package> +% \end{macrocode} +% +% If a cache file is detected and shell escape is enabled, the~.csv cache +% will be processed on demand by |\UlQda@GraphFlat| to generate +% GraphViz~.dot file output. +% +% \begin{macrocode} +%<*package> + \ifUlQda@cachepresent + \ifUlQda@shellescape + \ifUlQda@debug + \typeout{ulqda: Converting .csv to flat GraphViz dot file} + \fi + \immediate\write18{ulqda.pl --graphflat \UlQda@filter \UlQda@counts + -- \jobname.csv \jobname_flat.dot} + \fi + \fi + + \UlQda@DoGraph{#1}% + } + +%</package> +% \end{macrocode} +% +% The following package internal macro, |\UlQda@DoGraph|, actually enacts +% the graph generation. +% +% \begin{macrocode} +%<*package> + \newcommand{\UlQda@DoGraph}[1]{ + \IfFileExists{\UlQda@GraphVizFileName}{ + \ifUlQda@shellescape + \begin{lrbox}{\UlQda@GraphSaveBox} +%</package> +% \end{macrocode} +% +% The next few lines are a hack to enable \texttt{dot2texi.sty} to work with +% an external .dot file\footnote{I have suggested this to Kjell Magne Fauskes, +% the \texttt{dot2texi.sty} author, and he intends to include such a feature +% natively in a future version.}. +% +% \begin{macrocode} +%<*package> + \stepcounter{dtt@fignum} + \setkeys{dtt}{#1} + \immediate\write18{cp "\UlQda@GraphVizFileName" "\dtt@figname.dot"} + \dottotexgraphicsinclude +%</package> +% \end{macrocode} +% +% Now we finish the |\ulqdaGraph| command. +% +% \begin{macrocode} +%<*package> + \end{lrbox} + \framebox{\usebox{\UlQda@GraphSaveBox}} \par + \else + \typeout{ulqda: shell escape not enabled} + \typeout{ulqda: unable to process \UlQda@GraphVizFileName} + \fi + } + } +%</package> +% \end{macrocode} +% \end{macro} +% +% We now create a |\ulqdaTable| macro -- a command to process the table of +% codes. It doesn't do terribly much, but it is there because it is useful +% and conceptually consistent with the graph macros. +% +% \begin{macro}{\ulqdaTable} +% \begin{macrocode} +%<*package> + \newcommand{\ulqdaTable}{ + \IfFileExists{\jobname_table.tex}{ + \input{\jobname_table.tex} + }{ +%</package> +% \end{macrocode} +% If a cache file is detected and shell escape is enabled, the~.csv cache +% will be processed on demand by |\ulqdaTable| to generate +% a multicolumn list of codes. +% \begin{macrocode} +%<*package> + \ifUlQda@cachepresent + \ifUlQda@shellescape + \ifUlQda@debug + \typeout{ulqda: Converting .csv to TeX table} + \fi + \immediate\write18{ulqda.pl --list \UlQda@filter \UlQda@counts + -- \jobname.csv \jobname_table.tex} + \fi + \fi + \IfFileExists{\jobname_table.tex}{ + \input{\jobname_table.tex} + } + } + } +%</package> +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Inactive Macro Stubs} +% If the package is not intended to be active, we need to create +% stub definitions for the macros that the package provides, so that +% document runs where the package is not active will succeed. +% +% \begin{macrocode} +%<*package> +\else % UlQda@activefalse +%</package> +% \end{macrocode} +% \begin{macro}{\ulqdaTable} +% \begin{macrocode} +%<*package> + \newcommand{\ulqdaTable}{} +%</package> +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ulqdaGraph} +% \begin{macrocode} +%<*package> + \newcommand{\ulqdaGraph}[2]{} +%</package> +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ulqdaCode} +% \begin{macrocode} +%<*package> + \newcommand{\ulqdaCode}[2]{} +%</package> +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ulqdaSetSectFilter} +% \begin{macrocode} +%<*package> + \newcommand{\ulqdaSetSectFilter}[1]{} +%</package> +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ulqdaSetSectFilter} +% \begin{macrocode} +%<*package> + \newcommand{\ulqdaClearSectFilter}{} +%</package> +% \end{macrocode} +% \end{macro} +% And finally close the conditional switch on whether active or not. +% \begin{macrocode} +%<*package> +\fi +%</package> +% \end{macrocode} +% +%\pagebreak +% +%\begin{thebibliography}{1} +% +%\bibitem{miles_and_huberman} +%M.~B. Miles and A.~M. Huberman, {\em {Qualitative Data Analysis: An Expanded +% Sourcebook}}. +%\newblock {2455 Teller Road, Thousand Oaks, California 91320, USA}: {Sage +% Publications, Inc.}, {1994}. +%\newblock {ISBN-10: 0-8039-5540-5}. +% +%\bibitem{glaser_strauss} +%B.~G. Glaser and A.~L. Strauss, {\em {The Discovery of Grounded Theory: +% Strategies for Qualitative Research}}. +%\newblock {200 Saw Mill River Road, Hawthorne, New York 10532, USA}: {Aldine De +% Gruyter}, {1967}. +%\newblock {ISBN-10: 0-202-30260-1}. +% +%\bibitem{strauss_corbin} +%A.~Strauss and J.~Corbin, eds., {\em {Grounded Theory in Practice}}. +%\newblock {2455 Teller Road, Thousand Oaks, California 91320, USA}: {Sage +% Publications}, {1997}. +%\newblock {ISBN-10: 0-7619-0748-3}. +% +%\bibitem{graphviz} +%E.~R. Gansner and S.~C. North, ``{An open graph visualization system and its +% applications to software engineering},'' {\em {Software - Practice and +% Experience}}, vol.~{30}, pp.~1203--1233, {1999}. +% +%\bibitem{dot2tex} +%K.~M. Fauske, ``{dot2text -- A GraphViz to \LaTeX\ converter},'' 2006. +%\newblock {available: \url{http://www.fauskes.net/code/dot2tex/} [accessed +% 2009-03-02 17h31}. +% +%\bibitem{locality_of_ref} +%B.~Appleton, ``The LoRD Principle -- Locality breeds Maintainability,'' {\em +% \href{http://c2.com/ppr/}{Portland Patterns Repository} +% \href{http://c2.com/cgi-bin/wiki?WelcomeVisitors}{wiki}}, 1997. +%\newblock {available: +% \url{http://c2.com/cgi/wiki?LocalityOfReferenceDocumentation} [accessed +% 2009-05-14 10h03]}. +% +%\bibitem{LaTeX_goes_with_the_flow} +%J.~Hefferon, ``{\LaTeX\ goes with the flow},'' {\em {The Prac\TeX\ Journal}}, +% no.~1, 2008. +%\newblock {available \url{http://www.tug.org/pracjourn/2008-1/hefferon/} +% [accessed 2009-03-02 17h51]}. +% +%\end{thebibliography}\clearpage +% +% \iffalse +%<*perl> +#!/usr/bin/perl +# +# Helper Perl script for ulqda +# A LaTeX package supporting Qualitative Data Analysis +# +# Copyright (C) 2009 by Ivan Griffin +# +# This file may be distributed and/or modified under the +# conditions of the LaTeX Project Public License, either +# version 1.2 of this license or (at your option) any later +# version. The latest version of this license is in: +# +# http://www.latex-project.org/lppl.txt +# +# and version 1.2 or later is part of all distributions of +# LaTeX version 1999/12/01 or later. +# + +use Getopt::Long; +use Digest::SHA1 qw(sha1 sha1_hex sha1_base64); + +sub Display_Version() +{ + print "Version: ulqda.pl [2009/05/15 v1.0 Qualitative Data Analysis package]\n\n"; + exit; +} + +sub Display_Usage() +{ + print<<"EOF"; +Usage: $0 <--list>|<--graphflat>|<--graphnet>|<--help>|<--version> \\ + [<--filter section>] [<--number-->] infile.csv outfile + +--filter: filter based on document section label +--graphflat: Generate GraphViz .dot output of codes (unconnected) +--graphnet: Generate GraphViz .dot output of codes (connected) +--help: Print this help and exit +--list: Generate LaTeX table of codes (labelled as table:qda_codes) +--number: Output quantity details +--version: Dispaly version information +EOF + exit; +} + +sub sort_codes_hashvalue_descending { + $codes{$b} <=> $codes{$a}; +} + +@colors = ("#d40000", "#e35a24", "#f67c00", "#faa800", "#ffc000", "#ffde00", "#aae900", "#62dc68", "#bbcced", "#a3bbe0", "#8aaad4", "#7299c7", "#5676b5", "#4554a3", "#2e3191", "#000472"); + +$result = GetOptions("number" => \$options{'n'}, + "list" => \$options{'l'}, + "graphflat" => \$options{'g'}, + "filter=s" => \$options{'f'}, + "graphnet" => \$options{'G'}, + "version" => \$options{'v'}, + "help" => \$options{'h'}); + +&Display_Usage() if !$result; +&Display_Usage() if $options{'h'}; + +&Display_Version() if $options{'v'}; + +if (!($options{'l'} || $options{'g'} || $options{'G'})) +{ + print "Requires one of --list, --graphflat, --graphnet, --version or --help\n\n"; + &Display_Usage() +} + + +if (($ARGV[0]) && ($ARGV[1])) +{ + open(FILEIN, "<$ARGV[0]") or die "Could not open input file $ARGV[0]\n"; + open(FILEOUT, ">$ARGV[1]") or die "Could not open output file $ARGV[1]\n"; +} +else +{ + &Display_Usage(); +} + + +if ($options{'l'}) +{ + print FILEOUT << "EOF"; +{ +\\vspace{0.1in} +\\hrule + +\\begin{multicols}{3} +\\label{table:qda_codes} +EOF +} +elsif ($options{'g'} || $options{'G'}) +{ + print FILEOUT << "EOF"; +digraph codes { +overlap=scale +ratio=compress +smoothType=spring +repulsiveforce=1.2 +splines=true + +# +# Nodes +# +EOF +} + + +<FILEIN>; # gobble first line (it is just header) + +# now, for each line, parse into comma separated values +# codes are further split based on the '!' separator character +# e.g. risk!business becomes two codes, risk and business, with a +# connection between risk->business +GOBBLE_LOOP: while (<FILEIN>) +{ + chomp; + ($page, $section, $code_list, $text) = split(/\,/, $_, 4); +#print"DEBUG: >>$code_list<< $_ \n"; + + if (($options{'f'}) && ($options{'f'} != $section)) + { + # filtering selected so if no match, then skip + next GOBBLE_LOOP; + } + + + foreach $code ( split(/\!/, $code_list) ) + { + $code =~ s/^ //g; + $codes{$code} += 1; + } + + @connections = (@connections, $code_list); +} +close(FILEIN); + +# +# Find the maximum number of connections and the minimum number of connections +# This will be used for scaling subsequently +# +$iterationCount = 0; $nodeCount = 0; +$maxConnections = 0; $minConnections=65535; + +LOOP: foreach $i (sort sort_codes_hashvalue_descending keys %codes) +{ + if ($codes{$i} > $maxConnections) { $maxConnections = $codes{$i} } + if ($codes{$i} < $minConnections) { $minConnections = $codes{$i} } +} + +# +# For each code, output it as requested +# +foreach $i (sort sort_codes_hashvalue_descending keys %codes) +{ + $digest = sha1_hex($i); + + if ($options{'l'} && ($iterationCount)) + { + print FILEOUT "\\\\\n"; + } + elsif ($options{'g'} || $options{'G'}) + { + $nodeCount++; + print FILEOUT "Node$digest [label=\""; + } + + $i =~ s/!/:/g; + print FILEOUT "$i"; + + if ($options{'n'}) + { + print FILEOUT "{\\textcolor{red}{" if ($options{'l'}); + print FILEOUT "($codes{$i})"; + print FILEOUT "}}" if ($options{'l'}); + } + + $fontSize = 15 + ((60 * $codes{$i})/$maxConnections); + + if ($options{'g'} || $options{'G'}) + { + print FILEOUT "\", fontsize=$fontSize"; + #if ($iterationCount <= 5) + { + # heatmap based colors + # $colorIndex = 6 - int((6*($codes{$i} - $minConnections))/($maxConnections - $minConnections)); + # index based colors + $colorIndex = int(($iterationCount*16)/(keys %codes)); + print FILEOUT ",color=\"$colors[$colorIndex]\",style=filled"; + } + print FILEOUT "]\n"; + } + elsif (! $options{'l'} ) + { + print FILEOUT "\n"; + } + $iterationCount++; +} + +# +# For connection graphs, process each connection between points +# +if ($options{'G'}) +{ + print FILEOUT <<"EOF"; + +# +# Connections +# +EOF + + for $code_list (@connections) + { + print FILEOUT "// $code_list\n"; + @code_list_array = split(/\!/, $code_list); + $previous_code = shift(@code_list_array); + $previous_code =~ s/^ //g; + + if (defined($previous_code)) + { + foreach $code ( @code_list_array ) + { + $code =~ s/^ //g; + $previous_digest = sha1_hex($previous_code); + $digest = sha1_hex($code); + + # ensure only 1 connection between points + if (!defined($connection{"$previous_digest-$digest"})) + { + $connection{"$previous_digest-$digest"} = 1; + $len=0.25+(0.75*$codes{$previous_code}/$maxConnections); + $w=0.25+(0.75*$codes{$previous_code}/$maxConnections); + print FILEOUT "Node$previous_digest->Node$digest [label=\"\", w=$w, len=$len]\n"; + } + + $previous_code = $code; + } + } + } +} + +# +# Tidy up +# +if ($options{'l'}) +{ + print FILEOUT << "EOF"; +\\end{multicols} +\\hrule +EOF +} + +print FILEOUT "\n}\n"; + +close(FILEOUT); +%</perl> +% \fi +% \Finale +% +% \typeout{*********************************************************} +% \typeout{*} +% \typeout{* To finish the installation you have to move the} +% \typeout{* following file into a directory searched by TeX:} +% \typeout{*} +% \typeout{* \space\space ulqda.sty} +% \typeout{*} +% \typeout{* and move the following file into your path:} +% \typeout{*} +% \typeout{* \space\space ulqda.pl} +% \typeout{*} +% \typeout{* To produce the documentation run the file ulqda.dtx} +% \typeout{* through pdflatex.} +% \typeout{*} +% \typeout{*********************************************************} +% +\endinput diff --git a/Master/texmf-dist/tex/latex/ulqda/ulqda.sty b/Master/texmf-dist/tex/latex/ulqda/ulqda.sty new file mode 100644 index 00000000000..da0f8ccc5c8 --- /dev/null +++ b/Master/texmf-dist/tex/latex/ulqda/ulqda.sty @@ -0,0 +1,245 @@ +%% +%% This is file `ulqda.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% ulqda.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Copyright (C) 2009 by Ivan Griffin +%% +%% This file may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.2 of this license or (at your option) any later +%% version. The latest version of this license is in: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% and version 1.2 or later is part of all distributions of +%% LaTeX version 1999/12/01 or later. +%% +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesPackage{ulqda} + [2009/05/15 v1.0 Qualitative Data Analysis package] +\RequirePackage{soul} +\RequirePackage{color} +\RequirePackage{multicols} +\RequirePackage{tikz} +\RequirePackage[cache]{dot2texi} +\usetikzlibrary{backgrounds,shapes,arrows,positioning} + +\definecolor{UlQda@lightblue}{rgb}{0.80,0.85,1} +\sethlcolor{UlQda@lightblue} + +\newif\ifUlQda@debug \UlQda@debugfalse +\newif\ifUlQda@cache \UlQda@cachefalse +\newif\ifUlQda@cachepresent \UlQda@cachepresentfalse +\newif\ifUlQda@shellescape \UlQda@shellescapetrue +\newif\ifUlQda@MiKTeX \UlQda@MiKTeXfalse +\newif\ifUlQda@active \UlQda@activefalse +\newif\ifUlQda@counts \UlQda@countsfalse + +\DeclareOption{active}{\UlQda@activetrue} +\DeclareOption{debug}{\UlQda@debugtrue} +\DeclareOption{cache}{\UlQda@cachetrue} +\DeclareOption{nocache}{\UlQda@cachefalse} +\DeclareOption{shell}{\UlQda@shellescapetrue} +\DeclareOption{noshell}{\UlQda@shellescapefalse} +\DeclareOption{MiKTeX}{\global\UlQda@MiKTeXtrue} +\DeclareOption{counts}{\global\UlQda@countstrue} + +\DeclareOption*{% + \PackageWarning{ulqda}{Unknown option `\CurrentOption'}% +} + +\ExecuteOptions{shell} +\ProcessOptions\relax + +\ifUlQda@counts + \def\UlQda@counts{--number } +\else + \def\UlQda@counts{ } +\fi + +%% test if shell escape really works +\ifUlQda@shellescape + \def\tmpfile{/tmp/shellEscapeTest-\the\year\the\month\the\day-\the\time} + \immediate\write18{\ifUlQda@MiKTeX rem >"\tmpfile" \else touch \tmpfile \fi} + \IfFileExists{\tmpfile}{ + \UlQda@shellescapetrue + \immediate\write18{\ifUlQda@MiKTeX del "\tmpfile" \else rm -f \tmpfile \fi} + }{\UlQda@shellescapefalse} +\fi + +\ifUlQda@shellescape + \ifUlQda@debug + \PackageInfo{ulqda}{TeX Shell escape enabled.} + \fi +\else + \PackageWarningNoLine{ulqda} {TeX Shell escape not enabled.\MessageBreak% + Manually process the CSV output with ulqda.pl} +\fi + +\newcommand{\ulqdaHighlight}[2]{% + \hl{\protect\ul{#2}}% + \marginpar% + {\raggedright\hbadness=10000\tiny\it \hl{#1}\par}% + \par% + } + +\newcommand{\ulQda}{\textsf{ul\kern -.075em\lower .3ex\hbox {\protect\emph{q}}da}} + +\ifUlQda@active + \AtBeginDocument{% + \typeout{ulqda: Loaded - 2009/05/15 v1.0 Qualitative Data Analysis package} + \ifUlQda@cache + \IfFileExists{\jobname.csv} % + { + \ifUlQda@debug + \typeout{ulqda: QDA cache file \jobname.csv found} + \fi + \UlQda@cachepresenttrue + } + { + \ifUlQda@debug + \typeout{ulqda: QDA cache file \jobname.csv not found} + \fi + \UlQda@cachepresentfalse + } + \else + \ifUlQda@debug + \typeout{ulqda: caching disabled} + \fi + \UlQda@cachepresentfalse + \fi + + % Code macro + \ifUlQda@cachepresent + \newcommand{\ulqdaCode}[2]{\ulqdaHighlight{#1}{#2}} + \else + \ifUlQda@debug + \typeout{ulqda: Creating QDA cache file \jobname.csv} % + \fi + \newwrite\ulqdaCodeFile % + \immediate\openout\ulqdaCodeFile=\jobname.csv % + \immediate\write\ulqdaCodeFile{Page Number, Section, Code, Text} % + + \def\UlQda@ListIt#1[#2,{% + \ifUlQda@debug % + \typeout{ulqda: Coding "#2" as "#1" on page \thepage, section \thesection} + \fi % + \immediate\write\ulqdaCodeFile{\thepage, \thesection, #2, "#1"} + \index{#2} % + \@ifnextchar]% Look ahead one token. + {\eatthesquarebracket}% End of list. + {\UlQda@ListIt{#1}[}% Process rest of list. + } + \def\eatthesquarebracket]{} % Gobble the square bracket. + % + % Coding macro + \newcommand{\ulqdaCode}[2]{\ulqdaHighlight{#1}{#2} \UlQda@ListIt{#2}[#1,]} % + \fi + } % end of \AtBeginDocument + +\newcommand{\UlQda@FirstOfTwo}[1]{ + \ifx#1\UlQda@MyUndefinedMacro + ?\typeout{ulqda: undefined reference, please re-run} + \else + \expandafter\@firstoftwo#1 + \fi} +\newcommand{\UlQda@RefToSectNum}[1]{ + \expandafter \ifx\csname r@#1\endcsname\relax + ?\typeout{ulqda: undefined reference, please re-run} + \else + \expandafter\UlQda@FirstOfTwo\csname r@#1\endcsname + \fi} + \def\UlQda@filter{} + \newcommand{\ulqdaSetSectFilter}[1]{ + \ifUlQda@shellescape + \immediate\write18{\ifUlQda@MiKTeX del \else rm -f -- \fi \jobname_net.dot} + \immediate\write18{\ifUlQda@MiKTeX del \else rm -f -- \fi \jobname_flat.dot} + \immediate\write18{\ifUlQda@MiKTeX del \else rm -f -- \fi \jobname_table.tex} + \fi + \def\UlQda@filter{--filter \UlQda@RefToSectNum{#1}} + } + \newcommand{\ulqdaClearSectFilter}{\def\UlQda@filter{}} + \newcommand{\ulqdaGraph}[2]{\expandafter\csname UlQda@Graph#1\endcsname{#2}} + \newcommand\UlQda@Graphflat[1]{\UlQda@GraphFlat{#1}} + \newcommand\UlQda@Graphnet[1]{\UlQda@GraphNet{#1}} + \newcommand{\UlQda@GraphVizFileName}{} + \newsavebox{\UlQda@GraphSaveBox} + \newcommand{\UlQda@GraphNet}[1]{% + \renewcommand{\UlQda@GraphVizFileName}{\jobname_net.dot}% + \ifUlQda@cachepresent + \ifUlQda@shellescape + \ifUlQda@debug + \typeout{ulqda: Converting .csv to hierarchical GraphViz dot file} + \fi + \immediate\write18{ulqda.pl --graphnet \UlQda@filter \UlQda@counts + -- \jobname.csv \jobname_net.dot} + \fi + \fi + + \UlQda@DoGraph{#1}% + } + \newcommand{\UlQda@GraphFlat}[1]{% + \renewcommand{\UlQda@GraphVizFileName}{\jobname_flat.dot}% + \ifUlQda@cachepresent + \ifUlQda@shellescape + \ifUlQda@debug + \typeout{ulqda: Converting .csv to flat GraphViz dot file} + \fi + \immediate\write18{ulqda.pl --graphflat \UlQda@filter \UlQda@counts + -- \jobname.csv \jobname_flat.dot} + \fi + \fi + + \UlQda@DoGraph{#1}% + } + + \newcommand{\UlQda@DoGraph}[1]{ + \IfFileExists{\UlQda@GraphVizFileName}{ + \ifUlQda@shellescape + \begin{lrbox}{\UlQda@GraphSaveBox} + \stepcounter{dtt@fignum} + \setkeys{dtt}{#1} + \immediate\write18{cp "\UlQda@GraphVizFileName" "\dtt@figname.dot"} + \dottotexgraphicsinclude + \end{lrbox} + \framebox{\usebox{\UlQda@GraphSaveBox}} \par + \else + \typeout{ulqda: shell escape not enabled} + \typeout{ulqda: unable to process \UlQda@GraphVizFileName} + \fi + } + } + \newcommand{\ulqdaTable}{ + \IfFileExists{\jobname_table.tex}{ + \input{\jobname_table.tex} + }{ + \ifUlQda@cachepresent + \ifUlQda@shellescape + \ifUlQda@debug + \typeout{ulqda: Converting .csv to TeX table} + \fi + \immediate\write18{ulqda.pl --list \UlQda@filter \UlQda@counts + -- \jobname.csv \jobname_table.tex} + \fi + \fi + \IfFileExists{\jobname_table.tex}{ + \input{\jobname_table.tex} + } + } + } +\else % UlQda@activefalse + \newcommand{\ulqdaTable}{} + \newcommand{\ulqdaGraph}[2]{} + \newcommand{\ulqdaCode}[2]{} + \newcommand{\ulqdaSetSectFilter}[1]{} + \newcommand{\ulqdaClearSectFilter}{} +\fi +\endinput +%% +%% End of file `ulqda.sty'. diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index 368c3bd7bfb..b88aadf7d5a 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -235,7 +235,8 @@ my @WorkingTLP = qw( trajan translator tree-dvips trfsigns trivfloat trsym tufte-latex tugboat tugboat-plain turnstile twoup txfonts Type1fonts typedref typogrid - uaclasses uebungsblatt ucdavisthesis ucthesis uhrzeit uiucthesis ulsy + uaclasses uebungsblatt ucdavisthesis ucthesis uhrzeit uiucthesis + ulqda ulsy umich-thesis uml umlaute umthesis umtypewriter underlin undertilde units unitsdef universa unroman diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds index 96745e7e466..2c1efd31b89 100755 --- a/Master/tlpkg/libexec/ctan2tds +++ b/Master/tlpkg/libexec/ctan2tds @@ -294,6 +294,7 @@ chdir $startdir || die "chdir($startdir) failed: $!"; # back to raw 'lshort-finnish', '&MAKElshort', 'lshort-korean', '&MAKElshort', 'lshort-mongol', '&MAKElshort', + 'lshort-mongolian', "die 'skipping, replaced by lshort-mongol'", 'lshort-portuguese', '&MAKElshort', 'lshort-slovenian', '&MAKElshort', 'lshort-turkish', '&MAKElshort', @@ -1097,6 +1098,7 @@ $standarddocfmt='latex'; 'tablists', 'tablists.dtx', 'thesis', 'install.01|install.ndx', 'turnstile', 'turnstile-en.ins', # skip pt + 'ulqda', 'ulqda.dtx', ); $standardins='\.ins'; @@ -1423,6 +1425,7 @@ $standardxmt='\.xmt'; 'texcount' => '\.pl$', 'texdirflatten' => 'texdirflatten$', 'texloganalyser' => 'texloganalyser', + 'ulqda' => '\.pl$', 'vpe' => '\.pl$', ); diff --git a/Master/tlpkg/tlpsrc/collection-science.tlpsrc b/Master/tlpkg/tlpsrc/collection-science.tlpsrc index 2d68b505df8..e959e3ec2d5 100644 --- a/Master/tlpkg/tlpsrc/collection-science.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-science.tlpsrc @@ -45,6 +45,7 @@ depend siunitx depend struktex depend t-angles depend textopo +depend ulqda depend unitsdef depend youngtab depend collection-latex diff --git a/Master/tlpkg/tlpsrc/ulqda.tlpsrc b/Master/tlpkg/tlpsrc/ulqda.tlpsrc new file mode 100644 index 00000000000..4397da64f77 --- /dev/null +++ b/Master/tlpkg/tlpsrc/ulqda.tlpsrc @@ -0,0 +1,2 @@ +name ulqda +category Package |