summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2009-05-18 18:21:01 +0000
committerKarl Berry <karl@freefriends.org>2009-05-18 18:21:01 +0000
commit9ec59a52efe9f9a4e9dbdfb47f893f66e718ab69 (patch)
tree2ff54e57fd58a4a817db491a90d15766d8595736
parent6b60829e5501e746c1a35a55b1e4883dea9665cd (diff)
new latex package ulqda (15may09)
git-svn-id: svn://tug.org/texlive/trunk@13209 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Build/source/texk/texlive/linked_scripts/ChangeLog4
-rw-r--r--Build/source/texk/texlive/linked_scripts/Makefile.am1
-rwxr-xr-xBuild/source/texk/texlive/linked_scripts/ulqda/ulqda.pl252
-rw-r--r--Master/texmf-dist/doc/latex/ulqda/README42
-rw-r--r--Master/texmf-dist/doc/latex/ulqda/ulqda.pdfbin0 -> 285144 bytes
-rwxr-xr-xMaster/texmf-dist/scripts/ulqda/ulqda.pl252
-rw-r--r--Master/texmf-dist/source/latex/ulqda/Makefile35
-rw-r--r--Master/texmf-dist/source/latex/ulqda/ulqda.dtx1742
-rw-r--r--Master/texmf-dist/tex/latex/ulqda/ulqda.sty245
-rwxr-xr-xMaster/tlpkg/bin/tlpkg-ctan-check3
-rwxr-xr-xMaster/tlpkg/libexec/ctan2tds3
-rw-r--r--Master/tlpkg/tlpsrc/collection-science.tlpsrc1
-rw-r--r--Master/tlpkg/tlpsrc/ulqda.tlpsrc2
13 files changed, 2581 insertions, 1 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/ChangeLog b/Build/source/texk/texlive/linked_scripts/ChangeLog
index 03d771429f0..d38d3e47a0f 100644
--- a/Build/source/texk/texlive/linked_scripts/ChangeLog
+++ b/Build/source/texk/texlive/linked_scripts/ChangeLog
@@ -1,3 +1,7 @@
+2009-05-18 Karl Berry <karl@tug.org>
+
+ * Makefile.am (nobase_dist_script_SCRIPTS): add ulqda.pl.
+
2009-05-14 Peter Breitenlohner <peb@mppmu.mpg.de>
* Makefile.am (nobase_dist_script_SCRIPTS): pdfthumb.texlua and
diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.am b/Build/source/texk/texlive/linked_scripts/Makefile.am
index 3c9ebbc1bd3..3d53d779d20 100644
--- a/Build/source/texk/texlive/linked_scripts/Makefile.am
+++ b/Build/source/texk/texlive/linked_scripts/Makefile.am
@@ -87,6 +87,7 @@ nobase_dist_script_SCRIPTS = \
texdirflatten/texdirflatten \
texloganalyser/texloganalyser \
thumbpdf/thumbpdf.pl \
+ ulqda/ulqda.pl \
vpe/vpe.pl
## The idea is to install the scripts themselves in texmf*/scripts, and
diff --git a/Build/source/texk/texlive/linked_scripts/ulqda/ulqda.pl b/Build/source/texk/texlive/linked_scripts/ulqda/ulqda.pl
new file mode 100755
index 00000000000..9590ac8368e
--- /dev/null
+++ b/Build/source/texk/texlive/linked_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/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
new file mode 100644
index 00000000000..33d100a42f1
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/ulqda/ulqda.pdf
Binary files differ
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