From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/vhistory/vhistory.sty | 439 +++++++++++++++++++++++++++++ 1 file changed, 439 insertions(+) create mode 100644 macros/latex/contrib/vhistory/vhistory.sty (limited to 'macros/latex/contrib/vhistory/vhistory.sty') diff --git a/macros/latex/contrib/vhistory/vhistory.sty b/macros/latex/contrib/vhistory/vhistory.sty new file mode 100644 index 0000000000..b4e515923e --- /dev/null +++ b/macros/latex/contrib/vhistory/vhistory.sty @@ -0,0 +1,439 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% PACKAGE: vhistory %% +%% FILE: vhistory.sty %% +%% %% +%% AUTHOR: Jochen Wertenauer %% +%% VERSION: 1.6.1 %% +%% DATE: 2013-01-28 %% +%% %% +%% LICENSE: This program 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. %% +%% %% +%% This program consists of the file vhistory.sty (this file). %% +%% %% +%%--------------------------------------------------------------------------%% +%% DESCRIPTION (For better documentation see the seperate file.): %% +%% This package allows the creation to create a version history, where %% +%% the changes that have been made to a document are listed. %% +%% The version number of the last entry in the history is accessible (see %% +%% below) with the command \vhCurrentVersion, its date with \vhCurrentDate. %% +%% These commands can can be used for headers or title pages for example. %% +%% The list of all Authors is also available. It is stored in the set %% +%% \vhAllAuthorsSet. It can be printed using \vhListAllAuthors. There is %% +%% another command to list authors: \vhListAllAuthorsLong. This command %% +%% regards all elements in the authorset as commands (those elements do NOT %% +%% have the \ as first character) and expands them (see example below). %% +%% The sorting is based on the shortcuts and not on the expansion text! %% +%% %% +%% Note: The commands mentioned above work even before the version his- %% +%% tory specified. Therefore you need two runs of LaTeX. If 'N/A' is dis- %% +%% played instead of the correct number, you forgot the second run. %% +%% %% +%% OPTIONS: %% +%% - tocentry: If provided, the version history will show up in the table %% +%% of contents. By default it will not be added. %% +%% - nochapter: If provided, vhHistory will not start a new chaper/section %% +%% Use this option, if \section is undefined! %% +%% - owncaptions: You have to specify your own names for the captions. Use %% +%% this option if you are using a language that is not %% +%% supported. %% +%% - hideauthorcolumn: The history of versions does not contain the column %% +%% listing the name(s) of the author(s). %% +%% - tablegrid: If provided, the version history will display gridlines %% +%% %% +%% REQUIRED PACKAGES: %% +%% - sets: Works well with version 1.2 or higher %% +%% - ltxtable: Works well with version 0.2 from 1995-12-11 %% +%% ltxtable requires tabularx and longtable. Versions %% +%% - 2.07 (1999-01-07) of tabularx and %% +%% - 4.10 (2000-10-22) of longtable %% +%% worked fine. %% +%% %% +%% EXAMPLE OF USAGE: %% +%% For a better documentation see the seperate file. %% +%% %% +%% \usepackage{vhistory} %% +%% ... %% +%% \newcommand{\AH}{Alice Hosle} % NOTE: All names are invented. %% +%% \newcommand{\XY}{Mr. X} %% +%% \newcommand{\CR}{Charles Richards} %% +%% ... %% +%% \begin{document} %% +%% ... %% +%% \date{Version \vhCurrentVersion from \vhCurrentDate} %% +%% \author{\vhListAllAuthorsLong} %% +%% ... %% +%% \begin{versionhistory} %% +%% % Note the syntax of \vhEntry! Authors are separated by `|' %% +%% \vhEntry{0.1}{2004-04-23}{AH|XY}{Structure of chapters.} %% +%% \vhEntry{0.2}{2004-04-24}{AH|CR}{Chapter introduction completed} %% +%% \vhEntry{1.0}{2004-05-30}{XY}{spelling corrected} %% +%% \end{versionhistory} %% +%% ... %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{vhistory} +\RequirePackage{ltxtable, sets} + +%% Helper methods ------------------------------------------------------------ +\def \vh@empty{\empty} +\def \vh@iwrite{\immediate\write} + +\long\def \vh@ReturnFi #1\fi{\fi #1} + +%% Copied from the TeXbook +\def \vh@Ifundefined #1{\expandafter\ifx\csname#1\endcsname\relax} + +%% Prints the content of macro #1 without expansion. +\long \def \vh@verbprint #1{\expandafter\vh@eraseToBrace\meaning #1} + +%% This macro writes #2 verbatim to the (open) file #1. +\long \def \vh@verbwrite #1#2{% + \long \def \vh@verbtemp{#2}% + \expandafter\vh@iwrite\expandafter#1\expandafter{\expandafter\vh@eraseToBrace \meaning\vh@verbtemp}% +} + +%% Deletes everything before the next > e.g. "macro ->". Used by \vh@verbprint +\def \vh@eraseToBrace #1>{} +%% --------------------------------------------------------------------------- + +%% Multilanguage support ----------------------------------------------------- +\def \vh@setcaptions{% + \vh@EnglishCaptions %Default + \vh@Ifundefined{l@ngerman}\else + \ifnum \language=\l@ngerman\relax + \vh@GermanCaptions + \fi + \fi + \vh@Ifundefined{l@german}\else + \ifnum \language=\l@german\relax + \vh@GermanCaptions + \fi + \fi + \vh@Ifundefined{l@austrian}\else + \ifnum \language=\l@austrian\relax + \vh@GermanCaptions + \fi + \fi + \vh@Ifundefined{l@french}\else + \ifnum \language=\l@french\relax + \vh@FrenchCaptions + \fi + \fi + \vh@Ifundefined{l@dutch}\else + \ifnum \language=\l@dutch\relax + \vh@DutchCaptions + \fi + \fi + \vh@Ifundefined{l@croatian}\else + \ifnum \language=\l@croatian\relax + \vh@CroatianCaptions + \fi + \fi +} + +\def \vh@EnglishCaptions{% + \def\vhhistoryname{Revision History}% + \def\vhversionname{Revision}% + \def\vhdatename{Date}% + \def\vhauthorname{Author(s)}% + \def\vhchangename{Description}% +} + +\def \vh@GermanCaptions{% + \def\vhhistoryname{Versionshistorie}% + \def\vhversionname{Version}% + \def\vhdatename{Datum}% + \def\vhauthorname{Autor(en)}% + \def\vhchangename{\"Anderungen}% +} + +\def \vh@FrenchCaptions{% + \def\vhhistoryname{Historique}% + \def\vhversionname{Version}% + \def\vhdatename{Date}% + \def\vhauthorname{Auteur(s)}% + \def\vhchangename{Modifications}% +} + +\def \vh@DutchCaptions{% + \def\vhhistoryname{Wijzigingen}% + \def\vhversionname{Herziening}% + \def\vhdatename{Datum}% + \def\vhauthorname{Auteur(s)}% + \def\vhchangename{Beschrijving}% +} + +\def \vh@CroatianCaptions{% + \def\vhhistoryname{Povijest verzija}% + \def\vhversionname{Verzija}% + \def\vhdatename{Datum}% + \def\vhauthorname{Autor(ica)}% + \def\vhchangename{Opis Promjena}% +} +%% --------------------------------------------------------------------------- + +%% -- Options ---------------------------------------------------------------- +\def \vh@tocentry{0} % By default, there will be no entry in the toc +\def \vh@nochapter{0} % By default, a new chapter will be started +\def \vh@owncaptions{0} % By default, the build in captions are used. +\def \vh@hideauthor{0} % By default, the authors of a change are shown +\def \vh@tablegrid{0} % By default, there is no tablegrid + + +\DeclareOption{tocentry}{\def \vh@tocentry{1}}% +\DeclareOption{nochapter}{\def \vh@chapter{}}% +\DeclareOption{owncaptions}{\vh@setcaptions \def \vh@owncaptions{1}}% +\DeclareOption{hideauthorcolumn}{\def \vh@hideauthor{1}}% +\DeclareOption{tablegrid}{\def \vh@tablegrid{1}}% + +%% This macro starts a new chapter. If \chapter is undefined, \section is +%% used (To work with document class article). The option nochapter will +%% redefine this macro to {}. +%% +\def \vh@chapter{% + \vh@Ifundefined{chapter} + % Since chapter is undefined, we try section. If section is + % undefined, too we've got a problem. The User should use the option + % nochapter in this case. + \markright{\vhhistoryname}% + \ifnum \vh@tocentry=1\relax + \section{\vhhistoryname}% + \else + \section*{\vhhistoryname}% + \fi + \else + \markboth{\vhhistoryname}{\vhhistoryname}% + \ifnum \vh@tocentry=1\relax + \chapter{\vhhistoryname}% + \else + \chapter*{\vhhistoryname}% + \fi + \fi +} + +\ProcessOptions +%% --------------------------------------------------------------------------- + + +%% Informations accessible to the user --------------------------------------- + +%% This macro will expand to the current version number +\def \vhCurrentVersion{N/A} + +%% This macro will expand to the date of the last change +\def \vhCurrentDate{N/A} + +%% This set will contain all authors mentioned in the version history. +\newsetsimple \vhAllAuthorsSet{} + +%% Just a shortcut :-) +\def \vhListAllAuthors{\listset{\vhAllAuthorsSet}} + +%% Prints the contents of \vhAllAuthorsSet but regards the elements as +%% commands. Instead of XY, the definition of the command \XY will be used. +\def \vhListAllAuthorsLong{\expandafter\vh@longlistset\vhAllAuthorsSet|\endset|} + +%% Helper method for \vhListAllAuthorsLong. +\def \vh@longlistset #1|#2|{% + \expandafter\ifx\csname#1\endcsname\relax + #1% + \else + \csname#1\endcsname % Create command and expand + \fi + \ifx\endset#2% + \else + \setseparator\sets@ReturnFi{\vh@longlistset#2|}% + \fi +} + +%% Prints the contents of \vhAllAuthorsSet but regards the elements as +%% commands. Instead of XY, the definition of the command \XY will be used. +\def \vhListAllAuthorsLongWithAbbrev{\expandafter\vh@longlistsetWithAbbrev\vhAllAuthorsSet|\endset|} + +\def \vhAbbrevSeparator{\ } +\def \vhAbbrevLeft{(} +\def \vhAbbrevRight{)} + +%% Helper method for \vhListAllAuthorsLong. +\def \vh@longlistsetWithAbbrev #1|#2|{% + \expandafter\ifx\csname#1\endcsname\relax + #1% + \else + \csname#1\endcsname\vhAbbrevSeparator\vhAbbrevLeft #1\vhAbbrevRight% + \fi + \ifx\endset#2% + \else + \setseparator\sets@ReturnFi{\vh@longlistsetWithAbbrev#2|}% + \fi +} + +%% --------------------------------------------------------------------------- + + +%% -- Read file \jobname.hst, if existing ------------------------------------ +\IfFileExists{\jobname.hst}% +{\typeout{Reading file \jobname.hst...}\input{\jobname.hst}} % File exists +{\typeout{File \jobname.hst not found.}} % File doesn't exist. +%% --------------------------------------------------------------------------- + + +%% The environment versionhistory. +%% +%% At first the macro \decl@revhEntry will be called to allow the user to add +%% entries to the version history. Second step is to write the tables's head. +%% Third step is to delete previous contents of vhAllAuthorsSet. Now the +%% captions of the actual language are loaded. Last step is to start a new +%% chapter if the user wanted a new chapter. +%% At the end of the version history, the table's foot is written to the +%% \@verfile. Then the .hst file is written. Afterwards the command \vhEntry +%% is undeclared to prevent the user from making nonsense. The last step is +%% to load the table as a LTXtable, if the file exists. +%% +\newenvironment{versionhistory}{% + \vh@declarevhEntry + \vh@writeTable + \newsetsimple \vhAllAuthorsSet{}% + \ifnum \vh@owncaptions=0\relax% Defined by the options + \vh@setcaptions + \fi + \vh@chapter +}{ + \vh@writeEndTable + \vh@writeHstFile + \vh@undeclarevhEntry + \IfFileExists{\jobname.ver}{% file exists + \LTXtable{\textwidth}{\jobname.ver}}% + {\@latex@warning{Rerun LaTeX to get the history of versions.}}% +} + + +% This file contains the table that is the history of versions. +\newwrite \vh@verfile + +%% This macro is called, when the environment versionhistory begins. It +%% declares the macro vhEntry, which is used to add entries to the version +%% history. Parameters are: +%% #1: version number +%% #2: date +%% #3: author(s) +%% #4: changes +%% The content of the parameters is written to the file that contains the +%% table with the history of versions. +%% +\def \vh@declarevhEntry{% + \long \gdef \vhEntry ##1##2##3##4{% + \gdef \vhCurrentVersion{##1}% Update version number + \gdef \vhCurrentDate{##2}% Update date + \vh@add{##3}% + \vh@verbwrite \vh@verfile {##1}% + \vh@verbwrite \vh@verfile { & ##2}% + \ifnum \vh@hideauthor=0\relax + \vh@verbwrite \vh@verfile { & \listset{##3}}% + \fi + \ifnum \vh@tablegrid=0\relax + \vh@verbwrite \vh@verfile { & ##4\\}% + \else + \vh@verbwrite \vh@verfile { & ##4\\\hline}% + \fi + }% +} + + +%% Helper macro, called by vhEntry. This macro unions the given author +%% list with the global list of authors. +%% +\def \vh@add #1{% + \newsetsimple{\vh@EntrySet}{#1}% Define a temporary set + \unionsets{\vhAllAuthorsSet}{\vh@EntrySet}\to{\vhAllAuthorsSet}% + \global\let\vhAllAuthorsSet=\vhAllAuthorsSet% Results must be global +} + + +%% This macro is called, when the environment versionHistory is left. It +%% redefines the macro vhEntry, which will now produce an error message. +%% +\def \vh@undeclarevhEntry{% + \long\gdef \vhEntry ##1##2##3##4{% + \errhelp{\vhEntry can only be used in the versionHistory environment.}% + \errmessage{This command is not accessible here.}}% +} + + +%% This macro writes the current version number/date and the set of Authors to +%% the file \jobname.hst. Unwanted expansion of macros must be prevented here. +%% +\def \vh@writeHstFile{% + \newwrite \vh@hstfile% + \immediate \openout \vh@hstfile=\jobname.hst% + \vh@iwrite \vh@hstfile {% + \def \noexpand\vhCurrentVersion{\vh@verbprint\vhCurrentVersion}}% + \vh@iwrite \vh@hstfile {% + \def \noexpand\vhCurrentDate{\vh@verbprint\vhCurrentDate}}% + \vh@iwrite \vh@hstfile {% + \noexpand\newsetsimple \noexpand\vhAllAuthorsSet{\vh@verbprint\vhAllAuthorsSet}}% + \immediate \closeout \vh@hstfile% +} + +\def \vhAuthorColWidth{.5\hsize} +\def \vhChangeColWidth{1.5\hsize} + +\def \vh@showAuthorHead{% + \ifnum \vh@tablegrid=0\relax + \vh@verbwrite \vh@verfile {% + \begin{longtable}{@{}ll>{\hsize=\vhAuthorColWidth}X>{\hsize=\vhChangeColWidth}X@{}}% + }% + \else + \vh@verbwrite \vh@verfile {% + \begin{longtable}{@{}|l|l|>{\hsize=\vhAuthorColWidth}X|>{\hsize=\vhChangeColWidth}X|@{}}\hline% + }% + \fi +} + +\def \vh@hideAuthorHead{% + \ifnum \vh@tablegrid=0\relax + \vh@verbwrite \vh@verfile {\begin{longtable}{@{}llX@{}}}% + \else + \vh@verbwrite \vh@verfile {\begin{longtable}{@{}|l|l|X|@{}}\hline}% + \fi +} + +%% This macro is called at the beginning of a versionhistory environment. It +%% writes the head of the resulting table to the file \jobname.ver. The table +%% itself is a LTXtable, i.e. a longtable with the parameterset of tabularx. +%% +\def \vh@writeTable{% + \immediate \openout \vh@verfile=\jobname.ver% + \ifnum \vh@hideauthor=0\relax + \vh@showAuthorHead + \else + \vh@hideAuthorHead + \fi + \vh@verbwrite \vh@verfile {\textbf{\vhversionname}}% + \vh@verbwrite \vh@verfile { & \textbf{\vhdatename}}% + \ifnum \vh@hideauthor=0\relax + \vh@verbwrite \vh@verfile { & \textbf{\vhauthorname}}% + \fi + \ifnum \vh@tablegrid=0\relax + \vh@verbwrite \vh@verfile { & \textbf{\vhchangename}\\[1ex]}% + \else + \vh@verbwrite \vh@verfile { & \textbf{\vhchangename}\\\hline}% + \fi +} + + +%% This macro writes the end of the table that \vh@writeTable has begun. +%% +\def \vh@writeEndTable{% + \vh@verbwrite \vh@verfile{\end{longtable}}% + \immediate \closeout \vh@verfile% +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\endinput -- cgit v1.2.3