Skip to content

Instantly share code, notes, and snippets.

@jarmitage
Created April 2, 2021 07:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jarmitage/fc659e874b15cff871841cb76c94957b to your computer and use it in GitHub Desktop.
Save jarmitage/fc659e874b15cff871841cb76c94957b to your computer and use it in GitHub Desktop.
progress.sty (by Kasper Graverson) but exports .csv of progress % as well
%%
%% This is file `progress.sty',
%%
%% version 1.10
%%
%% Copyright (C) 2002-2003 Kasper B. Graversen - this is freeware
%%
%% Thanks to Robin Fairbairns for helping me sorting things out ;-)
%% Thanks to Dan Luecking for some definitions
%% Also thanks to David Bausum for his free 'trept' "TeX: Reference and Examples" information material
%%
%% Progress may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.1
%% 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.1 or later is part of all distributions of LaTeX
%% version 1999/06/01 or later.
% \usepackage{catchfile}
% \pagestyle{myheadings}
% \newwrite\appendwrite
% \newcommand*\appendtofile[2]{%
% \begingroup
% \IfFileExists{#1}%
% {\CatchFileDef{\filecontent}{#1}{\endlinechar=`^^J\catcode\endlinechar=12\relax}}% keep existing end-of-lines
% {\let\filecontent\empty}%
% \immediate\openout\appendwrite=#1\relax
% \immediate\write\appendwrite{\filecontent #2}%
% \immediate\closeout\appendwrite
% \endgroup
% }
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{progress}[2003/29/06 v1.10 progress package]
\typeout{Package: progress v1.10 <2003/29/06> (Kasper B. Graversen)}
% User-redefinable option: the form of the output filename
\newcommand{\ProgressReportName}{progress/html/\YYYYMMDDdate_\jobname.html}
\newcommand{\ProgressLogTest}{progress/csv/\YYYYMMDDdate_\jobname.csv}
% \newcommand{\appendtolog}[1]{\appendtofile{\ProgressLogTest}{#1}}
\newcommand{\appendtolog}[1]{\immediate\write\fl{#1}}
\def\sec{0,Abstract}
\def\sep{;}
% User-redefinable option: the size of the picture, if progress graphs are drawn
\newlength{\ProgressGfxUnitSize}
\setlength{\ProgressGfxUnitSize}{0.07mm} % default value
\newcount\ProgressGfxXSize
\newcount\ProgressGfxYSize
\ProgressGfxXSize = 100 \relax
\ProgressGfxYSize = 20 \relax
% User-redifinable option: the output in the document (dvi/pdf file)
\newcommand{\ProgressDocOutput}[1]{\marginpar{\ProgressDrawBar{#1}}}
% pr@gressArgument - holds the percent given to \progress{}
\newcount\pr@gressArgument
% pr@gressDepth is the level of output
% pr@gressDepth = 1 : only chapters
% pr@gressDepth = 2 : only chapters & sections
% pr@gressDepth = 3 : only chapters & sections & subsections
% pr@gressDepth = 4 : only chapters & sections & subsections & subsubsection
\newcount\pr@gressDepth
% pr@gressCurrentDepth denotes the currently encountered \chapter, \section, \subsection, or \subsubsection
% pr@gressCurrentDepth = 1 : chapter
% pr@gressCurrentDepth = 2 : section
% pr@gressCurrentDepth = 3 : subsection
% pr@gressCurrentDepth = 4 : subsubsection
\newcount\pr@gressCurrentDepth
% denotes if \progress should perfom actions or not
% \d@cumentstate = 1 : draft.. include all definitions
% \d@cumentstate = 2 : final.. include nothing
\newcount\d@cumentstate
\d@cumentstate=1\relax % default is draftmode (\relax stops scanning: it's only active job)
\DeclareOption{chapter}{\pr@gressDepth=1\relax}
\DeclareOption{section}{\pr@gressDepth=2\relax}
\DeclareOption{subsection}{\pr@gressDepth=3\relax}
\DeclareOption{subsubsection}{\pr@gressDepth=4\relax}
\DeclareOption{textonly}{\renewcommand{\ProgressDocOutput}[1]{\marginpar{{\scriptsize progress: #1\%}}}}
\DeclareOption{textgfx}{\renewcommand{\ProgressDocOutput}[1]{\marginpar{\ProgressDrawBar{#1}{\scriptsize~#1\%}}}}
\DeclareOption{final}{%
\newcommand{\progress}[1]{}% in final mode do not write anything to the document (nor to the html file!)
\d@cumentstate=2\relax% set to final mode
}%
\DeclareOption{draft}{
\d@cumentstate=1\relax% set to draft mode
\newcommand{\progress}[1]{%
% ask if current level is <= user specified level
\@tempcnta=\pr@gressDepth
\advance\@tempcnta by 1
\ifnum\pr@gressCurrentDepth < \@tempcnta
\pr@gressArgument=#1 % set a register to the given percent value to determine its size
\ifnum\pr@gressArgument < 0
\def\bgcolor{A05050} ****\else % HTML "brown"
\ifnum\pr@gressArgument < 51
\def\bgcolor{FF0000} \else % HTML "red"
\ifnum\pr@gressArgument < 71
\def\bgcolor{C71585} \else % HTML "MediumVioletRed"
\ifnum\pr@gressArgument < 81
\def\bgcolor{6495ED} \else % HTML light blue
\ifnum\pr@gressArgument < 91
\def\bgcolor{FF8C00} \else % orange
\ifnum\pr@gressArgument < 95
\def\bgcolor{008000} \else % green
\ifnum\pr@gressArgument = 100
\def\bgcolor{ADFF2F} % GreenYellow
\fi\fi\fi\fi\fi\fi\fi
\immediate\write\fp{<td bgcolor="\hashchar \bgcolor"><b><font color="\hashchar FFFFFF"> #1\percentchar</font><b></td></tr>}%
\ifdefined\COUNT\appendtolog{\sec\sep#1}\fi
\fi%
\ProgressDocOutput{#1} % write something in the document
}%
}%
\ProcessOptions\relax
%
% source2e contains some explanations of \@ifstar, \@dblarg, and the syntax of \chapter, ...
% \dosometingbefore/\dosomethingafter marks the stuff/macro that you can insert.
% Heiko <oberdiek@uni-freiburg.de>
%
% Syntax for \foo (\chapter, \section, ...):
% \foo*{...}
% \foo[...]{...}
% \foo{...}
% The star is catched by \@ifstar:
%%% define \percentchar and \hashchar by Dan Luecking
{\catcode`\%=12 \gdef\percentchar{%}}
{\catcode`\#=12 \gdef\hashchar{#}}
\AtBeginDocument{%
\ifnum\d@cumentstate = 1\relax % only if draft mode
\ifdefined\COUNT
\newwrite\fl
\immediate\openout\fl=\ProgressLogTest
\immediate\write\fl{Type\sep Number\sep Title\sep Progress}
\fi
%%% setup file write..
\newwrite\fp
\immediate\openout\fp=\ProgressReportName
%%% title header of document and document title
\immediate\write\fp{<html><head><title>[\eightdigitdate]\space \jobname</title>}
\immediate\write\fp{<style>body{font-family: Arial; background-color: \hashchar 262626; color: \hashchar fff;}</style>}
\immediate\write\fp{</head><body>}
\immediate\write\fp{<h1>[\eightdigitdate]\space \jobname </h1>}
%% start real HTML table
\immediate\write\fp{<table border="0" style="max-width:600px;" width="100\percentchar">}
\fi
}
% long definition since @mkboth otherwise fucks up when using headers in document
\newcommand{\insertChapter}[1]{%
\pr@gressCurrentDepth=1\relax
\begingroup
\set@display@protect
\let\@mkboth\@gobbletwo
\ifnum\thechapter > 0
\immediate\write\fp{<tr><td bgcolor="\hashchar cccccc" width=90\percentchar><font size="+3">\thechapter&nbsp;#1</font></td>}
\fi
\endgroup
\def\sec{chapter\sep\thechapter\sep#1}
}
\newcommand{\insertSection}[1]{%
\pr@gressCurrentDepth = 2\relax
\ifnum\pr@gressDepth > 1
\immediate\write\fp{<tr><td><font size="+2">&nbsp;&nbsp;&nbsp;&nbsp;\thesection&nbsp;#1</font></td>}
\def\sec{section\sep\thesection\sep#1}
\fi
}
\newcommand{\insertSubsection}[1]{%
\pr@gressCurrentDepth = 3\relax
\ifnum\pr@gressDepth > 2
\immediate\write\fp{<tr><td><font size="+1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\thesubsection&nbsp;#1</font></td>}
\def\sec{subsection\sep\thesubsection\sep#1}
\fi
}
\newcommand{\insertSubsubsection}[1]{%
\pr@gressCurrentDepth = 4\relax
\ifnum\pr@gressDepth > 3
\immediate\write\fp{<tr><td><font size="+0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\thesubsubsection&nbsp;#1</font></td>}
\def\sec{subsubsection\sep\thesubsubsection\sep#1}
\fi
}
%%% CHAPTER
\ifx\chapter\undefined
%no definition if in article mode or other modes without chapter
\else
\ifnum\d@cumentstate = 1\relax % only if draft mode
\newcommand*{\oooldchapter}{}% check, if \oooldchapter is free
\let\oooldchapter\chapter
\renewcommand*{\chapter}{%
\@ifstar{\starchapter}%
{\@dblarg\nostarchapter}%
}
\newcommand*{\starchapter}[1]{%
\oooldchapter*{#1}%
\insertChapter{#1}%
}
\newcommand{\nostarchapter}{}
\def\nostarchapter[#1]#2{% #1: toc entry, #2: main entry
\oooldchapter[{#1}]{#2}%
\insertChapter{#2}%
}
\fi
\fi
%%% SECTION
\ifnum\d@cumentstate = 1 \relax % only if draft mode
\newcommand*{\oooldsection}{}% check, if \oooldchapter is free
\let\oooldsection\section
\renewcommand*{\section}{%
\@ifstar{\starsection}%
{\@dblarg\nostarsection}%
}
\newcommand*{\starsection}[1]{%
\oooldsection*{#1}%
\insertSection{#1}%
}
\newcommand{\nostarsection}{}
\def\nostarsection[#1]#2{% #1: toc entry, #2: main entry
\oooldsection[{#1}]{#2}%
\insertSection{#2}%
}
\fi
%%% SUBSECTION
\ifnum\d@cumentstate = 1\relax % only if draft mode
\newcommand*{\oooldsubsection}{}% check, if \oooldchapter is free
\let\oooldsubsection\subsection
\renewcommand*{\subsection}{%
\@ifstar{\starsubsection}%
{\@dblarg\nostarsubsection}%
}
\newcommand*{\starsubsection}[1]{%
\oooldsubsection*{#1}%
\insertSubsection{#1}%
}
\newcommand{\nostarsubsection}{}
\def\nostarsubsection[#1]#2{% #1: toc entry, #2: main entry
\oooldsubsection[{#1}]{#2}%
\insertSubsection{#2}%
}
\fi
%%% SUBSUBSECTION
\ifnum\d@cumentstate = 1\relax % only if draft mode
\newcommand*{\oooldsubsubsection}{}% check, if \oooldchapter is free
\let\oooldsubsubsection\subsubsection
\renewcommand*{\subsubsection}{%
\@ifstar{\starsubsubsection}%
{\@dblarg\nostarsubsubsection}%
}
\newcommand*{\starsubsubsection}[1]{%
\oooldsubsubsection*{#1}%
\insertSubsection{#1}%
}
\newcommand{\nostarsubsubsection}{}
\def\nostarsubsubsection[#1]#2{% #1: toc entry, #2: main entry
\oooldsubsubsection[{#1}]{#2}%
\insertSubsubsection{#2}%
}%
\fi
%%% helper methods for generating the date for the HTML file output
\newcommand{\eightdigitdate}{%
\number\year-%
\ifnum\number \month< 10 0\number\month \else \number\month\fi-%
\ifnum\number \day < 10 0\number\day \else \number\day\fi%
}
%% is used for naming the progress output file. It returns an 8-digit date with no "." in format YYMMDD
\newcommand{\YYYYMMDDdate}{%
\number\year-%
\ifnum\number \month< 10 0\number\month \else \number\month\fi-%
\ifnum\number \day < 10 0\number\day \else \number\day\fi%
}
%% is used for naming the progress output file. It returns an 8-digit date with no "." in format DDMMYY
\newcommand{\DDMMYYYYdate}{%
\ifnum\number \day < 10 0\number\day \else \number\day\fi%
\ifnum\number \month< 10 0\number\month \else \number\month\fi%
\number\year%
}
%% is used for naming the progress output file. It returns an 8-digit date with no "." in format MMDDYY
\newcommand{\MMDDYYYYdate}{%
\ifnum\number \month< 10 0\number\month \else \number\month\fi%
\ifnum\number \day < 10 0\number\day \else \number\day\fi%
\number\year%
}
\AtEndDocument{%
\ifnum\d@cumentstate = 1\relax % only if draft mode
%% end overview table
\immediate\write\fp{</table>}
%% write legend table
\immediate\write\fp{<br><br><br><br><blockquote>Legend:<br><table border="0" cellspacing="0" cellpadding="5">}
\immediate\write\fp{<tr><td bgcolor="A05050" width=40> &nbsp; <td width=55> < 0 <td> Means the same as above 0, but indicate that the author is stuck and needs consultance with co-author(s) </td></tr>}
\immediate\write\fp{<tr><td bgcolor="FF0000"> <td> 0-50<td> Unfinished</td></tr>}
\immediate\write\fp{<tr><td bgcolor="C71585">&nbsp; <td>51-70<td> 1st draft - can have "rough edges"<br><br> Focus: main form, contents, major points.</td></tr>}
\immediate\write\fp{<tr><td bgcolor="6495ED">&nbsp; <td>71-80<td> 2nd draft <br><br> Focus: section consistency internally within the chapter, errors, misunderstandings, disagreements, missing points, missing references, additions, readability.</td></tr>}
\immediate\write\fp{<tr><td bgcolor="FF8C00">&nbsp; <td>81-90<td> 3rd draft<br><br> Focus: chapter consistency externally within the report, agreement with contents, form, last check if points have been left out, readability.</td></tr>}
\immediate\write\fp{<tr><td bgcolor="008000">&nbsp; <td>91-99<td> Deliverable</td></tr>}
\immediate\write\fp{<tr><td bgcolor="008000">&nbsp; <td>95 <td> Deliverable, all quotes checked</td></tr>}
\immediate\write\fp{<tr><td bgcolor="008000">&nbsp; <td>96 <td> Deliverable, BibTeX references checked</td></tr>}
\immediate\write\fp{<tr><td bgcolor="008000">&nbsp; <td>97 <td> Deliverable, punctuation checked</td></tr>}
\immediate\write\fp{<tr><td bgcolor="008000">&nbsp; <td>98 <td> Deliverable, thesaurus consulted</td></tr>}
\immediate\write\fp{<tr><td bgcolor="008000">&nbsp; <td>99 <td> Deliverable, whole document spelling checked</td></tr>}
\immediate\write\fp{<tr><td bgcolor="ADFF2F">&nbsp; <td>100 <td> Finished</td></tr>}
\immediate\write\fp{</table>}
%% end HTML
\immediate\write\fp{<table width="100\percentchar"><tr align="right"><td><font size="-2">report generated by progress.sty (c) Kasper B. Graversen 2002-2003</font></td></tr></tabel>}
\immediate\write\fp{</blockquote><br></body></html>}
\fi
}
% draws a progress bar with the argument as the percent
\newcommand{\ProgressDrawBar}[1]{%
\setlength{\unitlength}{\ProgressGfxUnitSize}
\begin{picture}(\ProgressGfxXSize,\ProgressGfxYSize)(0,0)
\put(0,0){\framebox(\ProgressGfxXSize,\ProgressGfxYSize)} % draw the progress box
% draw the progress bar
\@tempcnta=\ProgressGfxXSize
\ifnum \@tempcnta < 0 \multiply \@tempcnta by -1 \fi % handle negative %'s by * -1
\multiply \@tempcnta by #1 \divide \@tempcnta by 100
\multiput(1,0)(1,0){\@tempcnta}{\line(0,1){\ProgressGfxYSize}}
% draw the 25% marker
\@tempcnta=\ProgressGfxXSize \divide \@tempcnta by 4 % find x-length of 25%
\@tempcntb=\ProgressGfxYSize \divide \@tempcntb by 4 % find y-height of the 25% and 75% markers
\put(\@tempcnta ,0){\line(0,1){\@tempcntb}}%
% draw the 75% marker
\@tempcnta=\ProgressGfxXSize \divide \@tempcnta by 4 \multiply \@tempcnta by 3 % find x-length of 75%
\put(\@tempcnta ,0){\line(0,1){\@tempcntb}}%
% draw the 50% marker
\@tempcnta=\ProgressGfxXSize \divide \@tempcnta by 2 % find x-length of 50%
\@tempcntb=\ProgressGfxYSize \divide \@tempcntb by 2 % find y-height of the 50% marker
\put(\@tempcnta ,0){\line(0,1){\@tempcntb}}%
\end{picture}%
}
\endinput
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment