summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/proposal
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2016-04-15 21:38:41 +0000
committerKarl Berry <karl@freefriends.org>2016-04-15 21:38:41 +0000
commit5e77de80c3619d378c8a85ab0e2413086a57a8a5 (patch)
tree485e88bc2ff057b1286d2d244b8c6afb2ac16fd8 /Master/texmf-dist/source/latex/proposal
parentdac3dfcfa52f854fa71354a5f4c8c8bb3aa4bc43 (diff)
proposal (15apr16)
git-svn-id: svn://tug.org/texlive/trunk@40538 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/proposal')
-rw-r--r--Master/texmf-dist/source/latex/proposal/base/proposal.dtx33
-rw-r--r--Master/texmf-dist/source/latex/proposal/bin/Modparse.pm189
-rw-r--r--Master/texmf-dist/source/latex/proposal/bin/README32
-rwxr-xr-xMaster/texmf-dist/source/latex/proposal/bin/checksum71
-rwxr-xr-xMaster/texmf-dist/source/latex/proposal/bin/filedate45
-rwxr-xr-xMaster/texmf-dist/source/latex/proposal/bin/generate-issues470
-rw-r--r--Master/texmf-dist/source/latex/proposal/dfg/dfgproposal.dtx31
-rw-r--r--Master/texmf-dist/source/latex/proposal/eu/euproposal.dtx34
-rw-r--r--Master/texmf-dist/source/latex/proposal/lib/Makefile.ctan88
-rw-r--r--Master/texmf-dist/source/latex/proposal/lib/Makefile.in90
-rw-r--r--Master/texmf-dist/source/latex/proposal/lib/Makefile.vars38
-rw-r--r--Master/texmf-dist/source/latex/proposal/lib/proposal.bib76
12 files changed, 1147 insertions, 50 deletions
diff --git a/Master/texmf-dist/source/latex/proposal/base/proposal.dtx b/Master/texmf-dist/source/latex/proposal/base/proposal.dtx
index d58fadbca23..733f51aa51f 100644
--- a/Master/texmf-dist/source/latex/proposal/base/proposal.dtx
+++ b/Master/texmf-dist/source/latex/proposal/base/proposal.dtx
@@ -13,9 +13,9 @@
%
% \iffalse
%<cls|pdata|reporting>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-%<cls>\ProvidesClass{proposal}[2015/11/22 v1.5 Project Proposal]
-%<pdata>\ProvidesPackage{pdata}[2015/11/22 v1.5 Project Data]
-%<reporting>\ProvidesPackage{reporting}[2015/11/22 v1.5 Project Reporting]
+%<cls>\ProvidesClass{proposal}[2016/04/15 v1.5 Project Proposal]
+%<pdata>\ProvidesPackage{pdata}[2016/04/15 v1.5 Project Data]
+%<reporting>\ProvidesPackage{reporting}[2016/04/15 v1.5 Project Reporting]
%<*driver>
\documentclass{ltxdoc}
\DoNotIndex{\def,\long,\edef,\xdef,\gdef,\let,\global}
@@ -28,8 +28,8 @@
\RecordChanges
\usepackage{textcomp,url,paralist,a4wide,xspace}
\usepackage[show]{ed}
-\usepackage[maxbibnames=6,hyperref=auto,style=alphabetic]{biblatex}
-\bibliography{kwarc}
+\usepackage[maxbibnames=6,hyperref=auto,style=alphabetic,backend=bibtex]{biblatex}
+\addbibresource{../lib/proposal.bib}
\usepackage[bookmarks=true,linkcolor=blue,
citecolor=blue,urlcolor=blue,colorlinks=true,
breaklinks=true, bookmarksopen=true]{hyperref}
@@ -610,7 +610,7 @@
\renewcommand{\familydefault}{\sfdefault}
\RequirePackage[scaled=.90]{helvet}
\RequirePackage{textcomp}
-\RequirePackage[hyperref=auto,style=numeric,defernumbers=true,backend=bibtex,backref=true,firstinits=true,maxbibnames=6]{biblatex}[2010/11-19]
+\RequirePackage[hyperref=auto,style=alphabetic,defernumbers=true,backend=bibtex,backref=true,firstinits=true,maxbibnames=6]{biblatex}[2010/11-19]
\RequirePackage{csquotes}
\RequirePackage{mdframed}
\RequirePackage{pdata}
@@ -699,9 +699,9 @@
\stepcounter{@site}\pdata@def{site}{#1}{number}{\the@site}%
\@ifundefined{prop@gen@sites}{\xdef\prop@gen@sites{#1}}{\xdef\prop@gen@sites{\prop@gen@sites,#1}}%
\define@key{prop@gen}{#1RM}{\pdata@def{site}{#1}{intendedRM}{##1}}%
-\if@RAM\define@key{prop@gen}{#1RAM}{\pdata@def{site}{#1}{intendedRAM}{##1}}\fi
+\define@key{prop@gen}{#1RAM}{\pdata@def{site}{#1}{intendedRAM}{##1}}
\define@key{workpackage}{#1RM}{\pdata@def\wp@id{#1}{RM}{##1}}%
-\if@RAM\define@key{workpackage}{#1RAM}{\pdata@def\wp@id{#1}{RAM}{##1}}\fi
+\define@key{workpackage}{#1RAM}{\pdata@def\wp@id{#1}{RAM}{##1}}
\define@key{prop@gen}{#1employed}{{\let\tabularnewline\relax\let\hline\relax\let\wa@ref\relax%
\@ifundefined{prop@gen@employed@lines}%
{\xdef\prop@gen@employed@lines{\wa@ref{institution}{#1}{shortname} & ##1\tabularnewline\hline}}%
@@ -828,8 +828,8 @@
\begin{itemize}
\@for\@I:=\prop@gen@PIs\do{%
\item Curriculum Vitae and list of publications for
- \wa@ref{person}\@I{personaltitle} \wa@ref{person}\@I{name}
-\end{itemize}}\newpage
+ \wa@ref{person}\@I{personaltitle} \wa@ref{person}\@I{name}}
+\end{itemize}\newpage
\printbibliography[heading=warnpubs]}
% \end{macrocode}
% \end{environment}
@@ -848,7 +848,7 @@
\pdata@open\jobname
\if@sites\else
\define@key{workpackage}{RM}{\pdata@def{wp}\wp@id{RM}{##1}\@dmp{RM=##1}}
-\if@RAM\define@key{workpackage}{RAM}{\pdata@def{wp}\wp@id{RAM}{##1}\@dmp{RAM=##1}}\fi
+\define@key{workpackage}{RAM}{\pdata@def{wp}\wp@id{RAM}{##1}\@dmp{RAM=##1}}
\fi
\newcounter{@PIs}
\@ifundefined{prop@gen@PIs}{}{\@for\@I:=\prop@gen@PIs\do{\stepcounter{@PIs}}}
@@ -1817,8 +1817,7 @@ ganttgray,.60/.60,.60,.60/0,0,.60/0,0,0,.40}
\else\begin{tabular}{|l|l|*{\thewpfig@options}{r|}|*{\the@sites}{r|}|r|}\hline\fi%|
\wpfig@headline\\\hline\hline}
{\end{tabular}\smallskip\\
-\wpfig@legend@RAM@expl
-\if@sites; \wpfig@legend@lead@expl\fi
+\wpfig@legend@RAM@expl\if@sites; \wpfig@legend@lead@expl\fi
\@ifundefined{wpfig@label}{\caption{\wpfig@legend@caption}}{\caption{\wpfig@caption}}
\@ifundefined{wpfig@label}{\label{fig:wplist}}{\label{\wpfig@label}}
\end{center}\end{table}}
@@ -2445,16 +2444,14 @@ joint&\multicolumn{\the@site}{l|}{\jpub $\hat=$ publication, \jpro $\hat=$ proje
% with the empty header we created before.
% \begin{macrocode}
\newcommand\prop@paperlist[2][]{%
-\begin{refsection}%
-\nocite{#2}\addtocategory{featured}{#2}%
\let\biboldfont\bibfont%
\renewcommand{\bibfont}{\footnotesize}%
\renewcommand{\baselinestretch}{.9}
+\def\do##1{\addtocategory{featured}{##1}}\docsvlist{#2}%
\setkeys{paperlist}{#1}
\@ifundefined{prop@rl}{}{\@latex@warning{some papers are not classified!}}
-\if@allpapers\printbibliography[heading=empty]\fi%
-\let\bibfont\biboldfont%
-\end{refsection}}
+\if@allpapers\printbibliography[category=featured,heading=empty]\fi%
+\let\bibfont\biboldfont}
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex/proposal/bin/Modparse.pm b/Master/texmf-dist/source/latex/proposal/bin/Modparse.pm
new file mode 100644
index 00000000000..2fd732b063d
--- /dev/null
+++ b/Master/texmf-dist/source/latex/proposal/bin/Modparse.pm
@@ -0,0 +1,189 @@
+#######################################################################################
+# A module for loading .tex files and feeding the data to the various applications. #
+# Copyright (c) 2005, Ioan Sucan, released under the Gnu General Public License (GPL) #
+# see http://www.gnu.org/copyleft/gpl.html #
+# $URL: svn://kwarc.eecs.iu-bremen.de/repos/kwarc/projects/content/bin/Modparse.pm$ #
+# $Date: 2005-09-26 12:44:28 -0500 (Mon, 26 Sep 2005) $ $Rev: 4243 $ #
+#######################################################################################
+
+package Modparse;
+
+use File::Basename;
+use File::Path;
+
+# if both snippath and snippathList are specified,
+# snippathList is ignored !
+
+# if a default snippath definition file is found
+# (snippath.def) it is used if no snippath is given
+# as argument;
+sub new {
+ my ($class, %options) = @_;
+
+ $options{recursion} = 1 unless defined $options{recursion};
+ $options{requireStatus} = 'include|exclude' unless defined $options{requireStatus};
+ $options{loadInputs} = 1 unless defined $options{loadInputs};
+ $options{onlyModuleLines} = 0 unless defined $options{onlyModuleLines};
+
+ if ( !(%{$options{snippath}}) && (-e "snippath.def") ) {
+ open(SNIPPATHDEF, 'snippath.def');
+ my @snlist = <SNIPPATHDEF>;
+ close(SNIPPATHDEF);
+ for (my $i = 0 ; $i <= $#snlist; $i++) { chomp($snlist[$i]); }
+ %{$options{snippath}} = @snlist; }
+ @{$options{snippathList}} = keys(%{$options{snippath}})
+ if ($options{snippath} && %{$options{snippath}});
+ $options{debug} = 0;
+
+ bless(\%options, $class); }
+
+sub execute{
+ my ($self, $file) = @_;
+
+ local *run_event = sub {
+ my ($event, $arg) = @_;
+ if ($self->{$event}) { $self->{$event}($arg); }
+ };
+
+ local *go = sub {
+ my ($location, %param) = @_;
+ my ($tex, $path, @tex_data) = $self->readLocation($location);
+ return unless @tex_data;
+ my $NL = $#tex_data+1;
+
+ $param{filename} = $tex;
+ $param{depth}++;
+ $param{filecount}++;
+ my $i = 0;
+
+ $param{nextline} = sub { $tex_data[++$i]; };
+ $param{prevline} = sub { $tex_data[--$i]; };
+ $param{rewriteline}= sub { $tex_data[$i] = $_[0]; };
+
+ print "Processing $tex...\n" if $self->{verbose};
+ run_event('onBeginFile', \%param);
+
+ while ($i<$NL){
+ $param{original} = $tex_data[$i];
+ $_ = $tex_data[$i]; chomp; /([^%]*)((%.*)?)/;
+ ($param{tex}, $param{comment}) = ($1, $2); $_ = $1;
+ s/\s+//g; $param{simple_tex} = $_;
+
+ if (/\\begin\{module\}(\[([^\]]*)\])?/) {
+ if ($param{in_module}) {
+ push(@{$param{module_stack}}, [$param{module_id}, $param{module_arg}]); }
+ $param{in_module} = 1;
+ $param{module_args} = $1 ? $2 : undef;
+ $param{module_id} = ($param{module_args} &&
+ $param{module_args} =~ /id=([^\],]+)/) ? $1 : undef;
+ $param{module_nesting}++;
+ run_event('onBeginModule', \%param); }
+
+ if (/\\end\{module\}/) {
+ run_event('onEndModule', \%param);
+ if ($#{$param{module_stack}} >= 0) {
+ ($param{module_id}, $param{module_args}) = @{pop(@{$param{module_stack}})};
+ } else {
+ $param{in_module} = 0;
+ ($param{module_id}, $param{module_args}) = (undef, undef); }
+ $param{module_nesting}--;
+ }
+
+ foreach my $srch_snippath(@{$self->{snippathList}}){
+ $self->{snippath}{$srch_snippath} = $1
+ if (/\\def\\$srch_snippath\#1\{([^\#]+)\#1\}$/); }
+
+ if ($self->{follow} && (/\\((requiremodules(\[($self->{requireStatus})\])?)|input|include)\{([^\}]+)\}/)){
+ my $req_filename = $5; my $req_spath = ''; my $command = $1;
+ my $is_require = ($command =~ /requiremodules/) ? 1 : 0;
+ if ($is_require || $self->{loadInputs}) {
+ foreach my $srch_snippath(@{$self->{snippathList}}){
+ if ($req_filename =~ /\\$srch_snippath\{(.+)/){
+ ($req_spath, $req_filename) = ($self->{snippath}{$srch_snippath}, $1);
+ last; }}
+ run_event('onRecurse', \%param);
+ if ($self->{recursion} || !$is_require) {
+ go($self->makeLocation($req_filename, $path, $req_spath), %param); }
+ }
+ }
+ run_event('onEveryLine', \%param) if ($param{in_module} || !$self->{onlyModuleLines});
+
+ last if (/\\end\{document\}/ && $self->{stopAtEnd});
+ $i++;
+ }
+ run_event('onEndFile', \%param);
+ $param{depth}--; return;
+ };
+
+ my %param = (pack=>$self, perm=>$self->{_AUX_DATA}, depth=>0, filecount=>0,
+ in_module=>0, module_nesting=>0);
+ run_event('onBegin', \%param);
+ go($self->makeLocation($file), %param);
+ run_event('onEnd', \%param);
+ return;
+}
+
+
+# add a [.tex] extension to the filename
+sub add_ext{
+ my ($self, $fn, $ext) = @_;
+ $ext = '.tex' unless $ext;
+ $fn.=$ext if $fn !~ /\Q$ext\E$/;
+ $fn; }
+
+# as long as the extension is .tex, drop it
+sub drop_ext{
+ my ($self, $filename) = @_;
+ while ($filename =~ /\.tex$/){
+ while ($filename !~ /\.$/ ) { chop($filename); }
+ chop($filename); }
+ $filename; }
+
+sub new_ext{
+ my ($self, $filename, $ext) = @_;
+ $self->add_ext($self->drop_ext($filename), $ext); }
+
+# location = pointer to array of strings
+# first element is filename; next are possible paths
+sub makeLocation{ my $self = shift; return \@_; }
+
+# read a location into an array of strings
+# aslo return filename and path to it (just in
+# case some changes were made to it, like adding
+# extension and/or relative paths)
+sub readLocation{
+ my ($self, $location) = @_;
+
+ my ($filename, @paths) = @{$location};
+ # try to add proper extension;
+ my $filename_ext = $self->new_ext($filename) unless -e $filename;
+ $filename = $filename_ext if $filename_ext && -e $filename_ext;
+
+ # try search paths
+ if (! -e $filename){
+ my $all_p = '';
+ foreach my $p(@paths){
+ $all_p .= $p;
+ $filename = $all_p.$filename and last if -e $all_p.$filename;
+ $filename = $p.$filename and last if -e $p.$filename;
+ if ($filename_ext){
+ $filename = $all_p.$filename_ext and last if -e $all_p.$filename_ext;
+ $filename = $p.$filename_ext and last if -e $p.$filename_ext; }
+ }}
+ # don't do the same work too many times
+ foreach my $file(@{$self->{loadedFiles}})
+ { return undef if $file eq $filename; }
+
+ push(@{$self->{loadedFiles}}, $filename);
+ open(FIN, $filename) or die "Cannot open '$filename'\n";
+ my @data = <FIN>;
+ close(FIN);
+
+ # find path of current file
+ my $path = dirname($filename);
+ $path.='/' if ($path ne '');
+
+ return ($filename, $path, @data);
+}
+
+1;
diff --git a/Master/texmf-dist/source/latex/proposal/bin/README b/Master/texmf-dist/source/latex/proposal/bin/README
new file mode 100644
index 00000000000..e33b26bf256
--- /dev/null
+++ b/Master/texmf-dist/source/latex/proposal/bin/README
@@ -0,0 +1,32 @@
+This directory contains the binaries for the proposal class.
+
+We have three utilities:
+- filedate and checksum are for managing metadata in the
+ DTX files of the sTeX distribution (written in perl)
+- Modparse.pm is a perl library they depend on
+- generate-issues is a ruby library that generates issues
+ on http://github.com for the project (experimental)
+
+============== Details =================
+
+checksum
+ "enable, update, and disable checksums in DTX files"
+
+Usage:
+ checksum [options]
+
+Options:
+ -- disable disable the checksum by wrapping in \iffalse ... \fi
+ -- enable remove those again
+ -- update update to the correct checksum
+
+
+filedate <input filename> <newdate>
+
+Purpose:
+ Update the dates for a \ProvidePackage invocation in a given .dtx source
+
+Example:
+ filedate omdoc.dtx
+
+
diff --git a/Master/texmf-dist/source/latex/proposal/bin/checksum b/Master/texmf-dist/source/latex/proposal/bin/checksum
new file mode 100755
index 00000000000..9f0e533a8d4
--- /dev/null
+++ b/Master/texmf-dist/source/latex/proposal/bin/checksum
@@ -0,0 +1,71 @@
+#!/usr/bin/perl -w
+#######################################################################################
+# A tool for updating .dtx files with a correspodning checksum counter #
+# Copyright (c) 2010, Deyan Ginev, released under the Gnu General Public License (GPL)#
+# see http://www.gnu.org/copyleft/gpl.html #
+# $URL: https://svn.kwarc.info/repos/stex/trunk/bin/checksum$ #
+#######################################################################################
+
+use strict;
+
+use Getopt::Long;
+use Modparse;
+use Pod::Usage;
+use Cwd qw(abs_path);
+
+####### start of program #######
+my $mode = "update"; #Default is update
+my $action = { "update" => \&update, "disable" => \&disable, "enable"=>\&enable };
+GetOptions("disable" => sub { $mode="disable"; },
+ "enable" => sub { $mode="enable"; },
+ "update" => sub { $mode="update"; });
+
+
+my ($path) = @ARGV;
+$path = abs_path($path);
+my ($volume,$dir,$file) = File::Spec->splitpath( $path );
+my @lines = `cd $dir; pdflatex "\\nonstopmode\\input{$file}"` if ($mode eq "update");
+my ($checksum) = map {$_=~/^\* The checksum should be (\d+)!/; $1;} grep ($_ =~ /^\* The checksum should be (\d+)!/,@lines) if @lines;
+if (!$checksum) {
+#One more possible error message:
+ ($checksum) = map {$_=~/^! Package doc Error: Checksum not passed \((\d+)<>(\d+)\)\./; $2;} grep ($_ =~ /^! Package doc Error: Checksum not passed \((\d+)<>(\d+)\)\./,@lines) if @lines;
+}
+open(IN,"<$path") or die "Cannot open DTX source: $path\n";
+@lines = ();
+while (<IN>) {
+ push @lines, &{$$action{$mode}}($_,$checksum);
+}
+close(IN);
+open(OUT,">$path") or die "Cannot write to DTX target: $path\n";
+print OUT join("",@lines);
+close(OUT);
+######### Subroutines ############
+sub update {
+ my $checksum=$_[1];
+ $_[0]=~s/\\CheckSum\{\d*\}/\\CheckSum{$checksum}/ if $checksum;
+ $_[0];
+}
+
+sub disable {
+ $_[0]=~s/\\CheckSum\{(\d*)\}/\\iffalse\\CheckSum\{$1}\\fi/ unless $_[0]=~/\\iffalse\\CheckSum\{(\d*)\}\\fi/;
+ $_[0];
+}
+
+sub enable {
+ $_[0]=~s/\\iffalse\\CheckSum\{(\d*)\}\\fi/\\CheckSum{$1}/;
+ $_[0];
+}
+
+
+__END__
+
+
+=head1 SYNOPSIS
+
+checksum <input filename> --update|enable|disable
+
+Purpose:
+ Update, enable or disable the \CheckSum macro for a given .dtx source
+
+Example:
+ checksum omd.dtx --update
diff --git a/Master/texmf-dist/source/latex/proposal/bin/filedate b/Master/texmf-dist/source/latex/proposal/bin/filedate
new file mode 100755
index 00000000000..af49b6550dd
--- /dev/null
+++ b/Master/texmf-dist/source/latex/proposal/bin/filedate
@@ -0,0 +1,45 @@
+#!/usr/bin/perl -w
+#######################################################################################
+# A tool for updating .dtx files with a given package date. #
+# Copyright (c) 2010, Deyan Ginev, released under the Gnu General Public License (GPL)#
+# see http://www.gnu.org/copyleft/gpl.html #
+# $URL: https://svn.kwarc.info/repos/stex/trunk/bin/filedate$ #
+#######################################################################################
+
+use strict;
+
+use Getopt::Long;
+use Modparse;
+use Pod::Usage;
+use Cwd qw(abs_path);
+
+my ($file) = @ARGV;
+my $date = `git log --format='%ai' $file`;
+$date = substr($date, 0, index($date, ' '));
+$date =~ s/-/\//g;
+$file = abs_path($file);
+open(IN,"<$file");
+my @lines = ();
+while (<IN>) {
+ if ($_ =~ /\\Provides(Package|Class)/) {
+ $_ =~ s/\[(.*?)\s/\[$date /;
+ }
+ push @lines, $_;
+}
+close(IN);
+open(OUT,">$file");
+print OUT join("",@lines);
+close(OUT);
+
+__END__
+
+
+=head1 SYNOPSIS
+
+filedate <input filename> <newdate>
+
+Purpose:
+ Update the dates for a \ProvidePackage invocation in a given .dtx source
+
+Example:
+ filedate omdoc.dtx
diff --git a/Master/texmf-dist/source/latex/proposal/bin/generate-issues b/Master/texmf-dist/source/latex/proposal/bin/generate-issues
new file mode 100755
index 00000000000..84ebfd80fd6
--- /dev/null
+++ b/Master/texmf-dist/source/latex/proposal/bin/generate-issues
@@ -0,0 +1,470 @@
+#!/usr/bin/env ruby
+# Generate GitHub Issues for tasks and deliverables
+# - Each work package gets a WPX/README.md file
+# - Each task gets an Issue
+# - Each deliverable gets a Milestone
+# - Each deliverable gets an Issue associated with its Milestone
+# - Each deliverable Issue gets 'deliverable', 'WPX' tags
+# - Each task Issue gets 'task', 'WPX' tags
+
+# Run me from the proposal dir containing proposal.pdata:
+# cd ~/OpenDreamKit/Proposal
+# ~/path/to/LaTeX-Proposal/bin/generate-issues
+
+require 'date'
+require 'Octokit'
+require 'netrc'
+
+# constants for running the script are for OpenDreamKit
+# update these for your own proposal
+
+START_DATE = Date::new(2015, 9, 1) # start date of the project
+HOMEPAGE = "http://opendreamkit.org"
+PROPOSAL_URL = "https://github.com/OpenDreamKit/OpenDreamKit/raw/master/Proposal/proposal-www.pdf"
+PROJECT = "OpenDreamKit"
+REPO = "OpenDreamKit/OpenDreamKit"
+TARGET = "final" # or 'proposal'
+
+# throttle github creation requests to 5 Hz to avoid getting flagged for abuse
+THROTTLE_SECONDS = 5
+
+NATURES = {
+ 'R' => 'Report',
+ 'DEM' => 'Demonstrator',
+ 'DEC' => 'Websites, Media, etc.',
+ 'OTHER' => 'Other',
+}
+
+DISSEMINATIONS = {
+ 'PU' => 'Public',
+ 'CO' => 'Confidential',
+ 'CI' => 'Classified',
+}
+
+SITES = {
+ 'PS' => 'Université Paris-Sud',
+ 'LL' => 'Logilab',
+ 'UV' => 'Université de Versailles Saint-Quentin',
+ 'UJF' => 'Université Joseph Fourier',
+ 'UB' => 'CNRS',
+ 'UO' => 'University of Oxford',
+ 'USH' => 'University of Sheffield',
+ 'USO' => 'University of Southampton',
+ 'SA' => 'University of St Andrews',
+ 'UW' => 'University of Warwick',
+ 'JU' => 'Jacobs University Bremen',
+ 'UK' => 'University of Kaiserslautern',
+ 'US' => 'University of Silesia',
+ 'ZH' => 'Universität Zürich',
+ 'SR' => 'Simula Research Laboratory',
+}
+
+REVERSE_SITES = {}
+SITES.each_pair do |key, name|
+ REVERSE_SITES[name] = key
+end
+
+# Some sites would prefer alternative abbreviations
+REVERSE_SITES['University of St Andrews'] = 'USTAN'
+REVERSE_SITES['Université de Versailles Saint-Quentin'] = 'UVSQ'
+
+#------------------- Parsing proposal.pdata ---------------------
+
+def split_line(line)
+ # super primitive state-machine line split (not going to regex this)
+ parts = []
+ level = 0
+ buffer = []
+ line.each_char do |c|
+ case c
+ when '{'
+ if level > 0
+ buffer.push c
+ end
+ level += 1
+ when '}'
+ level -= 1
+ if level > 0
+ buffer.push c
+ end
+ if level == 0
+ parts.push(scrub_tex(buffer.join('')))
+ buffer = []
+ end
+ else
+ if level > 0
+ buffer.push c
+ end
+ end
+ end
+ return parts
+end
+
+
+def scrub_tex(text)
+ # scrub some latex markup from text
+ text.gsub!(/\\\w+/, '')
+ text.gsub!(/[{}]/, '')
+ text.strip.split.join(' ')
+end
+
+
+def transform_value(key, value)
+ case key
+ when 'lead'
+ return SITES[value]
+ when 'partners'
+ return value.split(',').map { |v| SITES[v] }
+ when 'dissem'
+ return DISSEMINATIONS[value]
+ when 'nature'
+ return NATURES[value]
+ when 'month'
+ return value.to_i
+ when 'delivs'
+ return value.split(',')
+ else
+ return scrub_tex(value)
+ end
+end
+
+
+def load_pdata(proposal_dir)
+ pdata = File.join(proposal_dir, "#{TARGET}.pdata")
+ deliv_data = File.join(proposal_dir, "#{TARGET}.deliverables")
+
+ workpackages = {} # mapping of workpackage id => wp info
+ deliverables = {}
+
+ File.readlines(pdata).each do |line|
+ key, *args = split_line line
+
+ case key
+ when 'wp'
+ name, key, value = args
+ value = transform_value(key, value)
+ if not workpackages.include? name
+ workpackages[name] = {
+ "tasks" => {},
+ "unknown-task" => nil,
+ "deliverables" => [],
+ }
+ end
+ wp = workpackages[name]
+ wp[key] = value
+
+ when 'task'
+ name, key, value = args
+ value = transform_value(key, value)
+ # find my workpackage
+ if name.index('@')
+ wpkey, short_name = name.split('@')
+ if short_name.match(/task\d+/)
+ workpackages[wpkey]['unknown-task'] = short_name
+ name = short_name
+ end
+ else
+ wpkey = workpackages.keys.select { |wpkey| name.start_with? wpkey }.first
+ end
+ # handle workpackage@taskNN weirdness
+ wp = workpackages[wpkey]
+ tasks = wp['tasks']
+ if not wp['unknown-task'].nil? and wp['unknown-task'] != name
+ tasks[name] = tasks.delete(wp['unknown-task'])
+ wp['unknown-task'] = nil
+ end
+ if not tasks.include? name
+ tasks[name] = {}
+ end
+ tasks[name][key] = value
+ when 'deliv'
+ name, key, value = args
+
+ value = transform_value(key, value)
+ if not deliverables.include? name
+ deliverables[name] = {}
+ end
+ deliverables[name][key] = value
+
+ else
+ # DEBUG:
+ # puts " Ignored: #{args}"
+ end
+ end
+
+ # get deliverable data, workpackage id from proposal.deliverables
+ File.readlines(deliv_data).each do |line|
+ args = split_line line
+ name = args[3]
+ if deliverables.include? name
+ deliverable = deliverables[name]
+ else
+ deliverable = {}
+ end
+ month = args[0].to_i
+ deliverable = (deliverables[name] or {}).merge({
+ "month" => month,
+ # due date is last day of the given month, so subtract one day
+ "due_date" => (START_DATE >> month) - 1,
+ "label" => scrub_tex(args[2]),
+ "deliv_id" => args[3],
+ "dissem" => transform_value('dissem', args[4]),
+ "nature" => transform_value('nature', args[5]),
+ "title" => scrub_tex(args[6]),
+ "lead" => SITES[scrub_tex(args[8])],
+ })
+ wpid = scrub_tex(args[7])
+ wp = workpackages.values.find {|wp| wp['label'] == wpid}
+ wp['deliverables'].push(deliverable)
+ end
+
+ workpackages.values.each do |wp|
+ wp['deliverables'].sort_by! {|d| d['label']}
+ end
+
+ return workpackages.values.sort_by {|wp| wp['label']}
+end
+
+
+#--------------- GitHub-related ---------------------
+
+def check_token
+ # get GitHub auth token, creating one if we don't find it.
+ rc = Netrc.read Netrc.default_path
+ if not rc['api.github.com'].nil?
+ return
+ end
+ puts "We need your password to generate an OAuth token. The password will not be stored."
+ username = ask "Username: "
+ password = ask("Password: ") { |q| q.echo = '*' }
+ client = Octokit::Client.new(
+ :login => username,
+ :password => password,
+ )
+ reply = client.create_authorization(
+ :scopes => ["public_repo"],
+ :note => "Issue Migration",
+ )
+ token = reply.token
+ rc['api.github.com'] = username, token
+ rc.save
+end
+
+$cache = {
+ 'issues' => {},
+ 'milestones' => {},
+}
+
+def get_issues(github, repo)
+ # get issues for a repo (cached)
+ cache = $cache['issues']
+ if not cache.include? repo
+ cache[repo] = github.issues(repo)
+ end
+ return cache[repo]
+end
+
+def get_milestones(github, repo)
+ # get issues for a repo (cached)
+ cache = $cache['milestones']
+ if not cache.include? repo
+ cache[repo] = github.list_milestones(repo)
+ end
+ return cache[repo]
+end
+
+# Templates for making readmes, issues
+
+README_TPL = <<-END
+# %{title}
+
+Lead Institution: %{lead}
+
+See page %{page} of the [proposal](#{PROPOSAL_URL}) for the full description.
+END
+
+TASK_TPL = <<-END
+- **%{wplabel}:** [%{wptitle}](https://github.com/#{REPO}/tree/master/%{wplabel})
+- **Lead Institution:** %{lead}
+- **Partners:** %{partners}
+- **Work phases:** %{wphases}
+
+See page %{page} of the [proposal](#{PROPOSAL_URL}) for the full description.
+END
+
+DELIV_TPL = <<-END
+- **%{wplabel}:** [%{wptitle}](https://github.com/#{REPO}/tree/master/%{wplabel})
+- **Lead Institution:** %{lead}
+- **Due:** %{date} (month %{month})
+- **Nature:** %{nature}
+
+See page %{page} of the [proposal](#{PROPOSAL_URL}) for the full description.
+END
+
+DELIV_MILESTONE_TPL = "# %{title}\n\n#{DELIV_TPL}"
+
+
+def make_task_issue(github, repo, task, workpackage, options)
+ title = "#{task['label']}: #{task['title']}"
+ issues = get_issues(github, repo)
+ issue = issues.find { |i| i.title.start_with?(task['label'] + ':') }
+ if issue.nil?
+ body = TASK_TPL % {
+ wplabel: workpackage['label'],
+ wptitle: workpackage['title'],
+ lead: task['lead'],
+ page: task['page'],
+ wphases: task['wphases'],
+ partners: (task['partners'] or ['None']).join(', ')
+ }
+ puts "\n\nMaking Issue on #{repo}: #{title}"
+ puts body
+
+ github.create_issue(repo, title, body, options)
+ # throttle creation calls to avoid flags for abuse
+ sleep THROTTLE_SECONDS
+ else
+ puts "Found Issue #{repo}##{issue.number}: #{issue.title}"
+ existing_labels = issue.labels.map { |label| label['name']}
+ missing_labels = options[:labels].reject { |label| existing_labels.include? label }
+ if not missing_labels.empty?
+ puts "Updating milestone, labels on #{repo}##{issue.number}"
+ github.update_issue(repo, issue.number, options)
+ sleep THROTTLE_SECONDS
+ end
+ end
+end
+
+
+def make_deliverable_issue(github, repo, deliverable, workpackage, options)
+ title = "#{deliverable['label']}: #{deliverable['title']}"
+ issues = get_issues(github, repo)
+ issue = issues.find { |i| i.title.start_with?(deliverable['label'] + ':') }
+ if issue.nil?
+ body = DELIV_TPL % {
+ wplabel: workpackage['label'],
+ wptitle: workpackage['title'],
+ lead: deliverable['lead'],
+ date: deliverable['due_date'],
+ month: deliverable['month'],
+ nature: deliverable['nature'],
+ page: deliverable['page'],
+ }
+ puts "\n\nMaking Issue on #{repo}: #{title}"
+ puts body
+ github.create_issue(repo, title, body, options)
+ # throttle creation calls to avoid flags for abuse
+ sleep THROTTLE_SECONDS
+ else
+ puts "Found Issue #{repo}##{issue.number}: #{issue.title}"
+ existing_labels = issue.labels.map { |label| label['name']}
+ missing_labels = options[:labels].reject { |label| existing_labels.include? label }
+ if issue.milestone.nil? or not missing_labels.empty?
+ puts "Updating milestone, labels on #{repo}##{issue.number}"
+ github.update_issue(repo, issue.number, options)
+ sleep THROTTLE_SECONDS
+ end
+ end
+end
+
+
+def make_deliverable_milestone(github, repo, deliverable, workpackage)
+ title = deliverable['label']
+
+ milestone = get_milestones(github, repo).find { |ms| ms.title == title }
+ if milestone.nil?
+ puts "Making milestone on #{repo}: #{title}"
+ body = DELIV_MILESTONE_TPL % {
+ wplabel: workpackage['label'],
+ wptitle: workpackage['title'],
+ title: deliverable['title'],
+ lead: deliverable['lead'],
+ date: deliverable['due_date'],
+ month: deliverable['month'],
+ nature: deliverable['nature'],
+ page: deliverable['page'],
+ }
+
+ milestone = github.create_milestone(repo, title,
+ :due_on => deliverable['due_date'],
+ :description => body,
+ )
+ # throttle creation calls to avoid flags for abuse
+ sleep THROTTLE_SECONDS
+ else
+ puts "Milestone #{repo}@#{title} exists"
+ end
+ return milestone.number
+end
+
+
+def populate_workpackage(github, repo, workpackage)
+ # populate issues for a given workpackage
+ label = workpackage['label']
+
+ readme_path = "#{label}/README.md"
+ begin
+ github.contents(repo, :path => readme_path)
+ rescue Octokit::NotFound
+ readme = README_TPL % {
+ title: "#{workpackage['label']}: #{workpackage['title']}",
+ lead: workpackage['lead'],
+ page: workpackage['page'],
+ }
+
+ puts "Creating readme at #{repo}/#{readme_path}"
+ puts readme
+ github.create_contents(repo, readme_path, "Creating #{readme_path}", readme)
+ # throttle creation calls to avoid flags for abuse
+ sleep THROTTLE_SECONDS
+ end
+
+ workpackage['tasks'].each_value do |task|
+ org_labels = [REVERSE_SITES[task['lead']]] + \
+ (task['partners'] or []).map {|site| REVERSE_SITES[site]}
+
+ make_task_issue(github, repo, task, workpackage,
+ :labels => [
+ 'task',
+ workpackage['label'],
+ ] + org_labels
+ )
+ end
+ workpackage['deliverables'].each do |deliverable|
+ milestone = make_deliverable_milestone(github, repo, deliverable, workpackage)
+ make_deliverable_issue(github, repo, deliverable, workpackage, {
+ :milestone => milestone,
+ :labels => [
+ 'deliverable',
+ workpackage['label'],
+ REVERSE_SITES[deliverable['lead']]
+ ]
+ })
+ end
+end
+
+
+def main(proposal_dir)
+ # run the whole thing
+
+ # verify that there's a GitHub token in .netrc
+ check_token
+
+ # create client
+ github = Octokit::Client.new(:netrc => true)
+ github.auto_paginate = true
+
+ load_pdata(proposal_dir).each do |wp|
+ populate_workpackage(github, REPO, wp)
+ end
+end
+
+if __FILE__ == $0
+ puts ARGV
+ if ARGV.length > 1
+ proposal_dir = ARGV[1]
+ else
+ proposal_dir = '.'
+ end
+ main(proposal_dir)
+end \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/proposal/dfg/dfgproposal.dtx b/Master/texmf-dist/source/latex/proposal/dfg/dfgproposal.dtx
index 53d3ecc23e8..63e6a46eadc 100644
--- a/Master/texmf-dist/source/latex/proposal/dfg/dfgproposal.dtx
+++ b/Master/texmf-dist/source/latex/proposal/dfg/dfgproposal.dtx
@@ -13,9 +13,9 @@
%
% \iffalse
%<cls|pdata|reporting>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-%<cls>\ProvidesClass{dfgproposal}[2015/11/22 v1.4 DFG Proposal]
-%<pdata>\ProvidesPackage{dfgpdata}[2015/11/22 v1.4 DFG Project Data]
-%<reporting>\ProvidesPackage{dfgreporting}[2015/11/22 v1.4 DFG Project Reporting]
+%<cls>\ProvidesClass{dfgproposal}[2016/04/15 v1.4 DFG Proposal]
+%<pdata>\ProvidesPackage{dfgpdata}[2016/04/15 v1.4 DFG Project Data]
+%<reporting>\ProvidesPackage{dfgreporting}[2016/04/15 v1.4 DFG Project Reporting]
%<*driver>
\documentclass[twoside]{ltxdoc}
\DoNotIndex{\def,\long,\edef,\xdef,\gdef,\let,\global}
@@ -28,8 +28,8 @@
\RecordChanges
\usepackage{textcomp,url,paralist,a4wide,xspace}
\usepackage[show]{ed}
-\usepackage[maxnames=6,hyperref=auto,style=alphabetic]{biblatex}
-\bibliography{kwarc}
+\usepackage[maxnames=6,hyperref=auto,style=alphabetic,backend=bibtex]{biblatex}
+\addbibresource{../lib/proposal.bib}
\usepackage[bookmarks=true,linkcolor=blue,
citecolor=blue,urlcolor=blue,colorlinks=true,
breaklinks=true, bookmarksopen=true]{hyperref}
@@ -72,10 +72,10 @@
% \subversion, allowing the proposal writing team to concentrate on the contents
% rather than the mechanics of wrangling with text fragments and revisions.
%
-% The |dfgproposal| class extends the |proposal| class~\cite{Kohlhase:pplp:svn} and
+% The |dfgproposal| class extends the |proposal| class~\cite{Kohlhase:pplp:ctan} and
% supports many of the specific elements of a DFG Proposal. The package documentation
% is still preliminary, fragmented and incomplete and only dwells on the particulars of
-% DFG proposals, so we treat~\cite{Kohlhase:pplp:svn} as a prerequisite. Please consult
+% DFG proposals, so we treat~\cite{Kohlhase:pplp:ctan} as a prerequisite. Please consult
% the example proposal |dfg/proposal.tex|, which comes with the package and shows the usage of
% the class in action. It is intended as a template for your proposal, but please bear in
% mind that the DFG guidelines may change, if in doubt, please consult the DFG guide for
@@ -106,7 +106,7 @@
%
% As usual in {\LaTeX}, the package is loaded by
% |\documentclass[|\meta{options}|]{dfgproposal}|, where |[|\meta{options}|]| is optional
-% and gives a comma separated list of options specified in~\cite{Kohlhase:pplp:svn}. The
+% and gives a comma separated list of options specified in~\cite{Kohlhase:pplp:ctan}. The
% |dfgproposal| class adds the two options
% \begin{compactenum}
% \item \DescribeMacro{general}|general|, which allows generates a first section with
@@ -507,9 +507,12 @@ Applicant\if@sites\ifnum\the@PIs>1{s}\fi\fi\ \deu{(Antragsteller)}}%
% \subsection{German Reports}\label{sec:impl:german}
%
% We have to redefine some macros for German reports.
+%
% \begin{macrocode}
%<*pdata>
\ifdeutsch
+\renewcommand\prop@count[1]{\ifcase #1 null\or ein\or zwei\or drei\or vier\or f"unf\or sechs\or sieben\or
+ acht\or neun\or zehn\or elf\or zw"olf\else#1\fi}
\renewcommand\prop@of@pages[2]{Seite~#1\ifofpage~von~#2\fi}
\renewcommand\wp@mk@title[1]{Arbeitspaket {#1}}
\renewcommand\wp@label[1]{AP{#1}}
@@ -532,9 +535,9 @@ Applicant\if@sites\ifnum\the@PIs>1{s}\fi\fi\ \deu{(Antragsteller)}}%
\renewcommand\wpfig@legend@totalRAM{Summe HM}
\renewcommand\wpfig@legend@RM{PM}
\renewcommand\wpfig@legend@RAM{HM}
-\renewcommand\wpfig@legend@RAM@expl{\if@RAM P/HM $\widehat=$ Personen/Hilfskraft Monate;\else\ Aufw\"ande in Personenmonaten\\\fi}
-\renewcommand\wpfig@legend@lead@expl{(Arbeitspaketleiter sind \wp@lead@style@explained}
-\renewcommand\wp@lead@style@explained{grau und kursiv markiert)}
+\renewcommand\wpfig@legend@RAM@expl{\if@RAM P/HM $\widehat=$ Personen/Hilfskraft Monate\else\ Aufw\"ande in Personenmonaten\fi}
+\renewcommand\wpfig@legend@lead@expl{Arbeitspaketleiter sind \wp@lead@style@explained}
+\renewcommand\wp@lead@style@explained{grau und kursiv markiert}
\renewcommand\wpfig@legend@caption{{\ifwork@areas Arbeitsbereiche und \fi}Arbeitspakete}
\renewcommand\wp@legend@site{Partner}
\renewcommand\wp@legend@effort{Aufwand\if@RAM{ (PM+HM)}\fi}
@@ -543,12 +546,14 @@ Applicant\if@sites\ifnum\the@PIs>1{s}\fi\fi\ \deu{(Antragsteller)}}%
\renewcommand\gantt@caption@lower{draft: unten die Lastverteilung}
\renewcommand\coherence@caption{Bisherige Kollaboration der {\pn} Partner}
\renewcommand\objective@label[1]{Z#1}
-\renewcommand\task@label[1]{S#1}
+\renewcommand\task@label[2]{S#1.#2}
% \renewcommand\month@label[1]{M#1}
\renewcommand\legend@partners{Partner}
\renewcommand\legend@lead{Leiter}
\renewcommand\task@label@long{Schritt}
-\fi
+\renewcommand\task@legend@partners{MA: }
+\renewcommand\task@legend@PM{PM}
+\fi%ifdeutsch
%</pdata>
% \end{macrocode}
% \Finale
diff --git a/Master/texmf-dist/source/latex/proposal/eu/euproposal.dtx b/Master/texmf-dist/source/latex/proposal/eu/euproposal.dtx
index 190575903b1..d9b2e3884a0 100644
--- a/Master/texmf-dist/source/latex/proposal/eu/euproposal.dtx
+++ b/Master/texmf-dist/source/latex/proposal/eu/euproposal.dtx
@@ -13,9 +13,9 @@
%
% \iffalse
%<cls|pdata|reporting>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-%<cls>\ProvidesClass{euproposal}[2015/11/22 v1.5 EU Proposal]
-%<pdata>\ProvidesPackage{eupdata}[2015/11/22 v1.5 EU Project Data]
-%<reporting>\ProvidesPackage{eureporting}[2015/11/22 v1.5 EU Project Reporting]
+%<cls>\ProvidesClass{euproposal}[2016/04/15 v1.5 EU Proposal]
+%<pdata>\ProvidesPackage{eupdata}[2016/04/15 v1.5 EU Project Data]
+%<reporting>\ProvidesPackage{eureporting}[2016/04/15 v1.5 EU Project Reporting]
%<*driver>
\documentclass[twoside]{ltxdoc}
\DoNotIndex{\def,\long,\edef,\xdef,\gdef,\let,\global}
@@ -28,8 +28,8 @@
\RecordChanges
\usepackage{textcomp,url,paralist,a4wide,xspace}
\usepackage[show]{ed}
-\usepackage[maxnames=6,hyperref=auto,style=alphabetic]{biblatex}
-\bibliography{kwarc}
+\usepackage[maxnames=6,hyperref=auto,style=alphabetic,backend=bibtex]{biblatex}
+\addbibresource{../lib/proposal.bib}
\usepackage[bookmarks=true,linkcolor=blue,
citecolor=blue,urlcolor=blue,colorlinks=true,
breaklinks=true, bookmarksopen=true]{hyperref}
@@ -149,7 +149,7 @@
% the title page, and specify their heights; |1.5cm| is often a good value.
% \end{compactitem}
%
-% \subsection{Work Packages and Work Areas}\label{sec:wpwa}
+% \subsection{Work Packages and Work Areas}\label{sec:user:wpwa}
%
% \DescribeMacro{type} The |type| key specifies the activity type of the work package:
% |RTD| = Research and technological development (including any activities to prepare for
@@ -171,7 +171,14 @@
% name/deliverables/verification columns in the milestone table.
%
% \subsection{Risks}\label{sec:user:risks}
-% \ednote{MK: document the infrastructure, make examples}
+% In some EU proposals (e.g. FET), we need to identify risks and contingency and specify
+% mitigation plans for them. In the |euproposal| we use two environments to mark them up.
+%
+% \DescribeMacro{risk}|\begin{risk}{|\meta{title}|}{|\meta{prob}|}{|\meta{grav}|}|\ldots|\end{risk}|
+% makes a paragraph no a risk \meta{title} with gravity \meta{grav} and probability
+% \meta{prob}, where the body of the environment contains a description of the risk. The
+% \DescribeMacro{riskcont}|riskcont| is a variant, where \meta{title} names a risk and the
+% body is a description of the contingency plan.
%
% \begin{newpart}{MK@MK: This is new, and only partially implemented}
% \subsection{Reporting Infrastructure}\label{sec:user:report}
@@ -427,7 +434,7 @@
% \end{macrocode}
% \end{environment}
%
-% \subsection{Work Packages, Work Areas, and Deliverables}\label{sec:wpwa}
+% \subsection{Work Packages, Work Areas, and Deliverables}\label{sec::impl:wpwa}
%
% \begin{environment}{wp*}
% \begin{macrocode}
@@ -555,17 +562,6 @@
% \end{macrocode}
% \end{environment}
%
-% \subsection{Risks}\label{sec:impl:risks}
-%
-% In some EU proposals (e.g. FET), we need to identify risks and contingency and specify
-% mitigation plans for them. In the |euproposal| we use two environments to mark them up.
-%
-% \DescribeMacro{risk}|\begin{risk}{|\meta{title}|}{|\meta{prob}|}{|\meta{grav}|}|\ldots|\end{risk}|
-% makes a paragraph no a risk \meta{title} with gravity \meta{grav} and probability
-% \meta{prob}, where the body of the environment contains a description of the risk. The
-% \DescribeMacro{riskcont}|riskcont| is a variant, where \meta{title} names a risk and the
-% body is a description of the contingency plan.
-%
% \subsection{Relevant Papers}\label{sec:impl:papers}
%
% \begin{macro}{\keypubs}
diff --git a/Master/texmf-dist/source/latex/proposal/lib/Makefile.ctan b/Master/texmf-dist/source/latex/proposal/lib/Makefile.ctan
new file mode 100644
index 00000000000..d24d524aa6a
--- /dev/null
+++ b/Master/texmf-dist/source/latex/proposal/lib/Makefile.ctan
@@ -0,0 +1,88 @@
+################################################################
+# make a zip for CTAN submission including the TeX directory structure.
+#
+# The overall procedure is to run make in this directory $(HERE) and then
+# export it to a temporary directory $(EXPORTED) without all the generated
+# files. On this directory we run "make ctanext" (see below) which makes a
+# CTAN-compliant directory structure, and zips it up to the file
+# <package>.ctan.zip which can be submitted to the CTAN maintainers.
+#
+# Note that part of the CTAN submission is a zip file with a TDS-compliant
+# directory struture, which is generated by running "make tdsext" (see below)
+# on $(EXPORTED).
+#
+# Note furthermore, that this Makefile only automates the top-level mechanics
+# of the CTAN zip files, ... It relies on the Variables set in the regular Makefiles
+# and in particular on their targets "ltds", "lctan", "filedate", and "checksum".
+################################################################
+
+HERE = $(shell pwd)
+GITREPOS = $(HERE)
+REPOSNAME = LaTeX-proposal
+TMP = /tmp
+#TDSCOLL ?= $(shell basename $$PWD)
+TDSCOLL = proposal
+EXPORTED = $(TMP)/$(TDSCOLL).exp
+
+TDS.dir = $(TDSCOLL).tds
+TDSDIR = $(TMP)/$(TDS.dir)
+TDS.zip = $(TDS.dir).zip
+TDSZIP = $(TMP)/$(TDS.zip)
+
+CTANDIR = $(TMP)/$(TDSCOLL)
+CTAN.zip = $(TDSCOLL).ctan.zip
+CTANZIP = $(TMP)/$(CTAN.zip)
+
+MAKE = make
+
+# this target makes the file CTANZIP by creating and populating the directory
+# CTANDIR and zipping it. To be current, we first make all, and update
+# the filedates and the checksums. To get rid of all the junk we commit and
+# export a clean copy EXPORTED, on which we run the target ctanexp below,
+# which generates a directory CTANDIR, which we zip and move into place.
+ctan: all filedate checksum
+ git commit -am'draining just to be sure for CTAN distribution' --allow-empty
+ rm -Rf $(EXPORTED)
+ @echo "exporting a clean copy to $(EXPORTED)"
+ cd $(TMP);rm -Rf $(REPOSNAME);git clone $(GITREPOS);mv $(REPOSNAME) $(EXPORTED)
+ rm -Rf $(EXPORTED)/.git
+ find $(EXPORTED) -name ".gitignore" -delete
+ cd $(EXPORTED);$(MAKE) -$(MAKEFLAGS) ctanext
+ @echo "zipping the result to $(TDSCOLL).ctan.zip"
+ cd $(TMP);zip -r $(CTANZIP) $(TDS.zip) $(TDSCOLL);cp $(CTANZIP) $(HERE)
+ @echo "cleaning up"
+ rm -Rf $(EXPORTED) $(CTANDIR) $(CTANZIP) $(TDSZIP)
+ @echo "disabling checksums again for further development"
+ $(MAKE) -$(MAKEFLAGS) disablechecksum
+
+# this target is run on EXPORTED. It first makes the target tdsext below,
+# and then copies all necessary stuff into CTANDIR.
+ctanext: tdsext
+ @echo "making a CTAN compliant archive in $(CTANDIR)"
+ rm -Rf $(CTANDIR) $(CTANZIP)
+ mkdir -p $(CTANDIR)
+ @echo " copying material from $(EXPORTED) to $(CTANDIR)"
+ @for d in $(DTXDIRS); do (cd $$d && $(MAKE) -$(MAKEFLAGS) lctan) done
+ @for d in $(SRCDIRS) $(DOCDIRS); do (cp -R $$d $(CTANDIR)) done;
+ @for d in $(SRCFILES); do (cp -p $$d $(CTANDIR)) done;
+ cp $(TDS.README) $(CTANDIR)/README
+
+# this target makes the file TDSZIP by creating and populating the directory
+# TDSDIR and zipping it.
+tdsext:
+ @echo "making a TDS compliant archive"
+ rm -Rf $(TDSDIR) $(TDSZIP)
+ @echo " enabling checksums"
+ $(MAKE) -$(MAKEFLAGS) enablechecksum
+ @echo " copying LaTeX Sources to $(TDSDIR)"
+ @for d in $(DTXDIRS); do (cd $$d && $(MAKE) -$(MAKEFLAGS) ltds) done
+ @echo " copying binary dir to $(TDSDIR)"
+ @for d in $(SRCDIRS); do (cp -R $$d $(TDSDIR)/source/latex/$(TDSCOLL)) done;
+ @for d in $(SRCFILES); do (cp -R $$d $(TDSDIR)/source/latex/$(TDSCOLL)) done;
+ @echo " copying documentation to $(TDSDIR)"
+ @for d in $(DOCDIRS); do (cp -R $$d $(TDSDIR)/doc/latex/$(TDSCOLL)) done;
+ @for d in $(TDS.doc); do (cp -R $$d $(TDSDIR)/doc/latex/$(TDSCOLL)) done;
+ @echo "zipping the result to $(TDSCOLL).tds.zip"
+ cd $(TDSDIR);zip -r -q $(TDSZIP) .
+ @echo "and removing the temporary directory $(TDSDIR)"
+ rm -Rf $(TDSDIR)
diff --git a/Master/texmf-dist/source/latex/proposal/lib/Makefile.in b/Master/texmf-dist/source/latex/proposal/lib/Makefile.in
new file mode 100644
index 00000000000..57da62fad1b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/proposal/lib/Makefile.in
@@ -0,0 +1,90 @@
+all: package doc
+package: $(DTX.sty) $(DTX.cls)
+doc: $(DTX.pdf) $(EXAMPLE.pdf)
+
+$(DTX.sty) $(DTX.cls): $(INS) $(DTX)
+ $(PDFLATEX) $(INS)
+
+
+$(EXAMPLE.pdf): %.pdf: %.tex $(DTX.sty) $(DTX.cls) $(EXAMPLE.deps)
+ $(PDFLATEX) $(firstword $<)
+ @if (grep 'Please (re)run Biber' $(patsubst %.dtx, %.log, $(firstword $<)) > /dev/null);\
+ then biber $(patsubst %.dtx, %, $(firstword $<));fi
+ @if (grep 'Please (re)run BibTeX' $(patsubst %.dtx, %.log, $(firstword $<)) > /dev/null);\
+ then bibtex $(patsubst %.dtx, %, $(firstword $<));fi
+ @if (grep "Writing index file" $(patsubst %.dtx, %.log, $(firstword $<)) > /dev/null);\
+ then makeindex\
+ -o $(patsubst %.dtx, %.ind, $(firstword $<))\
+ $(patsubst %.dtx, %.idx, $(firstword $<)); fi
+ @if (grep Rerun $(patsubst %.dtx, %.log, $(firstword $<)) > /dev/null);\
+ then $(PDFLATEX) $(firstword $<); fi
+ @if (grep Rerun $(patsubst %.dtx, %.log, $(firstword $<)) > /dev/null);\
+ then $(PDFLATEX) $(firstword $<); fi
+
+%.ind:
+ touch $@
+
+$(DTX.pdf): %.pdf: %.dtx $(DTX.sty) $(DTX.cls)
+ $(PDFLATEX) $(firstword $<)
+ @if (grep 'Please (re)run Biber' $(patsubst %.dtx, %.log, $(firstword $<)) > /dev/null);\
+ then biber $(patsubst %.dtx, %, $(firstword $<));fi
+ @if (grep "Writing glossary file" $(patsubst %.dtx, %.log, $(firstword $<)) > /dev/null);\
+ then makeindex\
+ -o $(patsubst %.dtx, %.gls, $(firstword $<))\
+ $(patsubst %.dtx, %.glo, $(firstword $<)); fi
+ @if (grep "Writing index file" $(patsubst %.dtx, %.log, $(firstword $<)) > /dev/null);\
+ then makeindex\
+ -o $(patsubst %.dtx, %.ind, $(firstword $<))\
+ $(patsubst %.dtx, %.idx, $(firstword $<)); fi
+ @if (grep Rerun $(patsubst %.dtx, %.log, $(firstword $<)) > /dev/null);\
+ then $(PDFLATEX) $(firstword $<); fi
+ @if (grep Rerun $(patsubst %.dtx, %.log, $(firstword $<)) > /dev/null);\
+ then $(PDFLATEX) $(firstword $<); fi
+
+clean:
+ rm -f *~ *.log *.ilg *.out *.glo *.idx *.ilg *.blg
+
+distclean: clean
+ rm -f *.aux *.ind *.gls *.ps *.dvi *.toc *.thm
+ rm -Rf auto
+
+filedate:
+ @for d in $(DTX); do \
+ $(FILEDATEPROG) $$d ; \
+ done
+
+checksum:
+ @for d in $(DTX); do \
+ $(CHECKSUMPROG) $$d --update ; \
+ done
+
+enablechecksum:
+ @for d in $(DTX); do \
+ $(CHECKSUMPROG) $$d --enable ; \
+ done
+
+disablechecksum:
+ @for d in $(DTX); do \
+ $(CHECKSUMPROG) $$d --disable ; \
+ done
+
+# copy stuff around for making the TeX Directory Structure
+ltds:
+ rm -Rf $(TDSDIR.doc);mkdir -p $(TDSDIR.doc)
+ rm -Rf $(TDSDIR.tex);mkdir -p $(TDSDIR.tex)
+ rm -Rf $(TDSDIR.src);mkdir -p $(TDSDIR.src)
+ cp $(DTX.src) $(TDS.src) $(TDSDIR.src)
+ cp $(DTX.sty) $(DTX.cls) $(TDS.tex) $(TDSDIR.tex)
+ cp README $(DTX.pdf) $(EXAMPLE.tex) $(EXAMPLE.pdf) $(TDS.doc) $(TDSDIR.doc)
+ @for d in $(TDS.exdirs); do cp -R $$d $(TDSDIR.doc); done
+
+lctan:
+ mkdir -p $(CTANDIR)
+ cp $(DTX.src) $(DTX.sty) $(DTX.cls) $(TDS.src) $(TDS.tex) $(CTANDIR)
+ cp README $(DTX.pdf) $(EXAMPLE.tex) $(EXAMPLE.pdf) $(TDS.doc) $(CTANDIR)
+ @for d in $(TDS.exdirs); do cp -R $$d $(CTANDIR); done
+
+# sometimes (when bibLaTeX changes) we have to rerun biber; use make -B biber
+biber:
+ pdflatex $(DTX.base:%=%.dtx)
+ biber $(DTX.base)
diff --git a/Master/texmf-dist/source/latex/proposal/lib/Makefile.vars b/Master/texmf-dist/source/latex/proposal/lib/Makefile.vars
new file mode 100644
index 00000000000..6155fee0909
--- /dev/null
+++ b/Master/texmf-dist/source/latex/proposal/lib/Makefile.vars
@@ -0,0 +1,38 @@
+# DTX.sty.base and DTX.cls.base are set in the including Makefiles
+DTX.base ?= $(DTX.sty.base) $(DTX.cls.base)
+DTX.src = $(DTX) $(DTX:%.dtx=%.ins)
+INS = $(DTX:%.dtx=%.ins)
+
+DTX.sty = $(DTX.sty.base:%=%.sty)
+DTX.cls = $(DTX.cls.base:%=%.cls)
+DTX.pdf = $(DTX:%.dtx=%.pdf)
+
+# The examples
+EXAMPLE.pdf = $(EXAMPLE.base:%=%.pdf)
+EXAMPLE.tex = $(EXAMPLE.base:%=%.tex)
+EXAMPLE.deps = $(filter-out $(EXAMPLE.base:%=%.tex), $(shell ls *.tex))
+
+# The TeX Directory Structure (see http://www.tug.org/tds/tds.html)
+TDSDIR = /tmp/$(TDSCOLL).tds
+TDSDIR.tex = $(TDSDIR)/tex/latex/$(TDSCOLL)/$(PACKAGE)
+TDSDIR.doc = $(TDSDIR)/doc/latex/$(TDSCOLL)/$(PACKAGE)
+TDSDIR.src = $(TDSDIR)/source/latex/$(TDSCOLL)/$(PACKAGE)
+
+# make a zip for CTAN submission
+CTANDIR = /tmp/$(TDSCOLL)/$(CTANPREFIX)$(PACKAGE)
+
+# the dependencies
+SOURCES = $(DTX.sty) $(BIB)
+TEXINPUTS := .:$(PREFIX)//:
+BIBINPUTS := .:$(PREFIX)//:
+BSTINPUTS := .:$(PREFIX)//:
+
+# we want to quiet down pdflatex
+PDFLATEX = pdflatex -interaction batchmode -file-line-error
+
+# we set the package date for 'make filedate' to today
+BINDIR = $(PREFIX)/../bin
+PACKAGEDATE ?= $(shell date "+%Y/%m/%d")
+FILEDATEPROG = PERL5LIB=$(BINDIR) $(BINDIR)/filedate
+CHECKSUMPROG = PERL5LIB=$(BINDIR) $(BINDIR)/checksum
+
diff --git a/Master/texmf-dist/source/latex/proposal/lib/proposal.bib b/Master/texmf-dist/source/latex/proposal/lib/proposal.bib
new file mode 100644
index 00000000000..8970c41baa9
--- /dev/null
+++ b/Master/texmf-dist/source/latex/proposal/lib/proposal.bib
@@ -0,0 +1,76 @@
+@STRING{stexyear = 2016}
+@techreport{Kohlhase:ed:ctan,crossref={Kohlhase:ed:base},
+ institution = {Comprehensive {\TeX} Archive Network (CTAN)},
+ CHANGEurl = {http://www.ctan.org/get/macros/latex/contrib/ed/ed.pdf},
+ pubs = {mkohlhase,projects/stex}}
+@techreport{Kohlhase:ed:svn,crossref={Kohlhase:ed:base},
+ url = {https://svn.kwarc.info/repos/kwarc/doc/macros/forCTAN/ed/ed.pdf}}
+@techreport{Kohlhase:ed:base,
+ author = {Michael Kohlhase},
+ title = {Editorial Notes for {\LaTeX}},
+ type = {Self-documenting {\LaTeX} package},
+ year = stexyear}
+
+@online{gitinfo2:on,
+ title = {gitinfo2.sty},
+ subtitle = {A package for accessing metadata from the git dvcs},
+ author = {Brent Longborough},
+ urldate = {2014-10-26},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/gitinfo2/gitinfo2.pdf}}
+
+@techreport{Kohlhase:workaddress:ctan,crossref={Kohlhase:workaddress:base},
+ institution = {Comprehensive {\TeX} Archive Network (CTAN)},
+ url = {http://mirror.ctan.org/macros/latex/contrib/stex/sty/workaddress/workaddress.pdf},
+ pubs = {mkohlhase,projects/stex}}
+@techreport{Kohlhase:workaddress:svn,crossref={Kohlhase:workaddress:base},
+ url = {https://github.com/KWARC/sTeX/raw/master/sty/stex/workaddress/workaddress.pdf}}
+@techreport{Kohlhase:workaddress:base,
+ author = {Michael Kohlhase},
+ title = {{\texttt{workaddress.sty}}: An Infrastructure for marking up {Dublin Core} Metadata in {\LaTeX} documents},
+ type = {Self-documenting {\LaTeX} package},
+ year = stexyear}
+
+@techreport{Kohlhase:pdrp:ctan,crossref={Kohlhase:pdrp:base},
+ institution = {Comprehensive {\TeX} Archive Network (CTAN)},
+ url = {http://mirror.ctan.org/macros/latex/contrib/proposal/dfg/dfgproposal.pdf},
+ pubs = {mkohlhase,projects/stex}}
+@techreport{Kohlhase:pdrp:svn,crossref={Kohlhase:pdrp:base},
+ url = {http://github.com/KWARC/LaTeX-proposal/dfg/dfgproposal.pdf}}
+@techreport{Kohlhase:pdrp:base,
+ author = {Michael Kohlhase},
+ title = {Preparing DFG Proposals and Reports in {\LaTeX} with {\texttt{dfgproposal.cls}}},
+ type = {Self-documenting {\LaTeX} package},
+ year = stexyear}
+
+@techreport{Kohlhase:pplp:ctan,crossref={Kohlhase:pplp:base},
+ institution = {Comprehensive {\TeX} Archive Network (CTAN)},
+ url = {http://mirror.ctan.org/macros/latex/contrib/proposal/base/proposal.pdf},
+ pubs = {mkohlhase,projects/stex}}
+@techreport{Kohlhase:pplp:svn,crossref={Kohlhase:pplp:base},
+ url = {http://github.com/KWARC/LaTeX-proposal/base/proposal.pdf}}
+@techreport{Kohlhase:pplp:base,
+ author = {Michael Kohlhase},
+ title = {Preparing Proposals in {\LaTeX} with {\tt{proposal.cls}}},
+ type = {Self-documenting {\LaTeX} package},
+ year = stexyear}
+
+@Manual{DFG:102e,
+ title = {Research Grants, Guidelines and Proposal Preparation Instructions},
+ organization = {German Research Foundation (DFG)},
+ url = {http://www.dfg.de/download/programme/emmy_noether_programm/antragstellung/1_02_e/1_02e.pdf},
+ month = oct,
+ year = 2010}
+
+@Manual{DFG:2012e,
+ title = {Guidelines for the Use of Funds International Research Grants with Guidelines for Final Reports},
+ organization = {German Research Foundation (DFG)},
+ url = {http://www.dfg.de/download/programme/sachbeihilfe/antragstellung/2_012_e/2_012e.pdf},
+ month = jul,
+ year = 2010}
+
+@Manual{DFG:201,
+ title = {Verwendungsrichtlinien, Sachbeihilfen mit Leitfaden f{\"ur}r Abschlussberichte und Regeln guter wissenschaftlicher Praxis},
+ organization = {German Research Foundation (DFG)},
+ url = {http://www.dfg.de/download/programme/sachbeihilfe/abschlussberichte/2_01/2_01.pdf},
+ month = jun,
+ year = 2010}