summaryrefslogtreecommitdiff
path: root/support/dtxgen
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dtxgen
Initial commit
Diffstat (limited to 'support/dtxgen')
-rw-r--r--support/dtxgen/README11
-rwxr-xr-xsupport/dtxgen/dtxgen462
-rw-r--r--support/dtxgen/dtxgen.pdfbin0 -> 56653 bytes
3 files changed, 473 insertions, 0 deletions
diff --git a/support/dtxgen/README b/support/dtxgen/README
new file mode 100644
index 0000000000..f27642aa86
--- /dev/null
+++ b/support/dtxgen/README
@@ -0,0 +1,11 @@
+ script: dtxgen - generate template for LaTeX self-extracting .dtx file
+ type: bash
+ author: Wybo Dekker
+ email: wybo@dekkerdocumenten.nl
+version: 1.08
+license: GNU General Public License
+--------------------------------------------------------------------------------
+dtxgen creates a template for a self-extracting .dtx file, based on the model described by
+[Joseph Wright](www.texdev.net/2009/10/06/a-model-dtx-file/). It is useful for
+those who plan to create a new Documented LaTeX Source (.dtx) file.
+
diff --git a/support/dtxgen/dtxgen b/support/dtxgen/dtxgen
new file mode 100755
index 0000000000..9d9e91103e
--- /dev/null
+++ b/support/dtxgen/dtxgen
@@ -0,0 +1,462 @@
+#!/bin/bash
+
+Version=1.08
+Myname="${0##*/}"
+
+:<<'DOC'
+= dtxgen - generate template for LaTeX self-extracting .dtx file
+
+= Synopsis
+dtxgen [options] basename.[sty,cls]
+
+== Options
+-h,--help print short help and exit
+-H,--Help print full documentation via less and exit
+-V,--version print version and exit
+-s,--short short, one-liner, package description
+-d,--date initial version's date. Default: current date
+-m,--mail your email address. Default: |$EMAIL|
+-n,--name your name. Default: |$NAME|
+-c,--class (class packs only) class to be preloaded. Default: article
+-q,--quiet run quietly
+
+= Description
+dtxgen creates a template for a self-extracting .dtx file, based on the model described by
+[Joseph Wright](www.texdev.net/2009/10/06/a-model-dtx-file/). It is useful for
+those who plan to create a new Documented LaTeX Source (.dtx) file.
+
+Usage example:
+
+ dtxgen -n 'your name' -m 'your@email.ad' myclass.cls
+
+The script takes some variables such as:
+- name and email address of the author,
+- a short description of the class or package generated from the .dtx file,
+- a date
+from environment variables, or from command line options and generates,
+among more, a template for the .dtx file with some minimal examples. Of
+course, the user will have to replace those examples with the real work,
+but the dates, basename, author's name and email address are already in
+place and, depending on whether you use used a .cls or a .sty extension
+in the argument, it is formatted to be either a class or a package
+source file.
+
+If you have an environment with your name and email address defined in
+NAME and EMAIL, you could simply type:
+
+ dtxgen myclass.cls
+
+and you would end up with five files: |myclass.dtx|, |myclass.cls|,
+|myclass.pdf|, |README|, and |Makefile|.
+
+= Options
+dtxgen recognizes the following options:
+
+-s,--short=...
+ A short, one-liner, description for the class or package.
+ By default, the string /A new LaTeX class/ or /A new LaTeX package/
+ will be used.
+-n,--name=...
+ Your name (first name, followed by surname). Alternatively,
+ you can set a default value in the environment variable |NAME|;
+ if you do so and still use this option, the option's value wills
+ have priority.
+-m,--mail=...
+ Your email address. Alternatively, you can set a default value ins
+ the environment variable |EMAIL|; if you do so and still use this
+ option, the option's value will have priority.
+-c,--class=...
+ For class templates only: inserts a |\LoadClass{...}|, so that the
+ new class will start with the properties of the |...| class.
+ The default is |article|.
+-d,--date=...
+ Set the initial version's date. By default, the current date will
+ be used. The date should be entered in the |yyyymmdd| format,
+ although it will be stored the LaTeX way: |yyyy/mm/dd|.
+-q,--quiet
+ Run quietly
+-V,--version
+ Prints the script's version and exits.
+-h,--help
+ Prints help information and exits.
+-H,--Help
+ print full documentation via less and exit
+
+= Makefile
+The |Makefile| can be used to compile new versions of your work; it contains the following targets:
+
+all (the default) generate the style or class file, the pdf-documentation,
+ and a README file.
+distclean remove all files that can be regenerated,
+clean same, except the style or class file, the pdf-documentation,
+ and a README file.
+inst install in the user's TeX tree,
+install install in the local TeX tree (uses sudo)
+zip produce a zip file ready for upload to CTAN
+
+= Author
+[Wybo Dekker](wybo@dekkerdocumenten.nl)
+
+= Copyright
+Released under the [GNU General Public License](www.gnu.org/copyleft/gpl.html)
+DOC
+
+# check executables and versions of bash and getopt
+((BASH_VERSINFO>=4)) || die "Need bash version >= 4"
+for i in getopt make; do
+ command -v "$i" &> /dev/null || die "$i: command not found"
+done
+i=$(getopt -T)
+{ (($?==4)) && [[ -z $i ]]; } || die "Your getopt is not GNU"
+
+# using the label in arg 2, read template from my self, filter it
+# through the script in arg 1, and write the output to the file in arg 3.
+# The default for arg 3 is arg 2
+function createfile {
+ file=$3
+ test "$file" = "" && file=$2
+ sed -n "/^:<<'$2'/,/^$2/p" "$0" |tail -n +2 |head -n -1 |sed "$1" >"$file"
+}
+
+REd='\e[38;5;9m'
+ die() { local i; for i; do echo -e "$Myname: $REd$i"; done 1>&2; exit 1; }
+helpsrt() { sed -n '/^= Synopsis/,/^= /p' "$0"|sed '1d;$d'; exit; }
+instscr() { instscript --zip --pdf "$Myname"; exit; }
+
+# shellcheck disable=SC2154
+helpall() { sed -n "/^:<<'DOC'$/,/^DOC/p" "$0"|sed -n '1d;$d;p'|
+ less -Ps"$Myname-${Version/./ยท} documentation - type h for help, q to quit."
+ exit
+ }
+
+if ! options=$(getopt \
+ -n "$Myname" \
+ -o s:n:m:c:d:hHVqI \
+ -l short:,name:,mail:,class:,date:,help,Help,version,quiet -- "$@"
+); then exit 1; fi
+eval set -- "$options"
+
+while [ $# -gt 0 ]; do
+ case $1 in
+ (-h|--help) # print short help and exit
+ helpsrt
+ ;;
+ (-H|--Help) # print full documentation via less and exit
+ helpall
+ ;;
+ (-V|--version) # print version and exit
+ echo $Version
+ exit
+ ;;
+ (-s|--short) # short, one-liner, package description
+ short=$2
+ shift 2
+ ;;
+ (-d|--date) # initial version's date. Default: current date
+ date=$2
+ shift 2
+ ;;
+ (-m|--mail) # your email address. Default: $EMAIL
+ mail=$2
+ shift 2
+ ;;
+ (-n|--name) # your name. Default: $NAME
+ name=$2
+ shift 2
+ ;;
+ (-c|--class) # (class packs only) class to be preloaded. Default: article
+ loadclass=$2
+ shift 2
+ ;;
+ (-q|--quiet) # run quietly
+ quiet=--quiet
+ shift
+ ;;
+ (-I) instscr
+ ;;
+ (--) shift
+ break
+ ;;
+ (*) break
+ ;;
+ esac
+done
+
+export year typ Typ lcl use # used in templates - shellcheck se them as unused
+
+name=${name:-${NAME:-(not set)}}
+mail=${mail:-${EMAIL:-(not set)}}
+date=${date:-$(date +%Y%m%d)}
+year=${date:0:4}
+loadclass=${loadclass:-article}
+
+# date must be 8 digits; insert the two /'s:
+if [[ ! $date =~ ^[[:digit:]]{8}$ ]]; then die "illegal date"; fi
+date=$(sed 's/\(....\)\(..\)\(..\)/\1\\\/\2\\\/\3/' <<<"$date")
+
+# argument must have .cls or .sty extension:
+base=${1%.*}
+ext=${1#*.}
+
+case "$ext" in
+(cls) typ=class; Typ=Class;
+ short=${short:-A new LaTeX class}
+ lcl='\\LoadClass[a4paper,fleqn]{'"$loadclass}"
+ ;;
+(sty) typ=package; Typ=Package;
+ short=${short:-A new LaTeX package}
+ use='\\usepackage{\\jobname}'
+ ;;
+(*) die "The argument must have .cls or .sty extension
+ (try the --help option)"
+esac
+
+# The short description may contain TeX commands, but then we need
+# a version without them at some places; note that this removes only
+# simple contructs:
+shrt=$(sed 's/\\[[:alpha:]]\\+{\\([^}]*\\)}/\\1/g;s/\\//g' <<<"$short")
+
+# Any \'s in the short description need to be duplicated for the script:
+short="${short//\\/\\\\}"
+
+test -z "$mail" && die "author's email not set - use option or environment variable EMAIL"
+test -z "$name" && die "author's name not set - use option or environment variable NAME"
+
+colw=${#base}
+(( colw = colw < 7 ? 7 : colw ))
+kopl="$(eval "printf '%.0s-' {1..$colw}")"
+kopr="$(eval "printf '%.0s-' {1..$((72-colw))}")"
+declare -A rm=(
+ [$kopl]=$kopr
+ [$base]=$shrt
+ [Author]=$name
+ [E-mail]=$mail
+ [License]='Released under the LaTeX Project Public License v1.3c or later'
+ [See]='http://www.latex-project.org/lppl.txt'
+)
+
+for i in $kopl $base Author E-mail License See; do
+ readme+="$(printf "%*s:| %s\\\\n" $colw "$i" "${rm[$i]}")"
+done
+
+# make sed script replacing the variables in the templates:
+sedscript=''
+for i in base year ext mail use typ Typ name date short shrt lcl readme; do
+ test $quiet || eval "echo -e \"$i \$$i\""|sed 's/\\\\/\\/g'
+ eval "sedscript+=\"s=%$i%=\$$i=g;\""
+done
+
+createfile "$sedscript" Makefile
+createfile "$sedscript" DTX "$base.dtx"
+make $quiet
+exit 0
+
+# ---- TEMPLATES: ----
+:<<'Makefile'
+NAME = %base%
+SHELL = bash
+PWD = $(shell pwd)
+VERS = $(shell ltxfileinfo -v $(NAME).dtx|sed -e 's/^v//')
+LOCAL = $(shell kpsewhich --var-value TEXMFLOCAL)
+UTREE = $(shell kpsewhich --var-value TEXMFHOME)
+all: $(NAME).pdf
+ test -e README.txt && mv README.txt README || exit 0
+$(NAME).pdf: $(NAME).dtx
+ pdflatex -shell-escape -recorder -interaction=batchmode $(NAME).dtx >/dev/null
+ if [ -f $(NAME).glo ]; then makeindex -q -s gglo.ist -o $(NAME).gls $(NAME).glo; fi
+ if [ -f $(NAME).idx ]; then makeindex -q -s gind.ist -o $(NAME).ind $(NAME).idx; fi
+ pdflatex --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
+ pdflatex --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
+clean:
+ rm -f $(NAME).{aux,fls,glo,gls,hd,idx,ilg,ind,ins,log,out}
+distclean: clean
+ rm -f $(NAME).{pdf,%ext%} README
+inst: all
+ mkdir -p $(UTREE)/{tex,source,doc}/latex/$(NAME)
+ cp $(NAME).dtx $(UTREE)/source/latex/$(NAME)
+ cp $(NAME).%ext% $(UTREE)/tex/latex/$(NAME)
+ cp $(NAME).pdf $(UTREE)/doc/latex/$(NAME)
+install: all
+ sudo mkdir -p $(LOCAL)/{tex,source,doc}/latex/$(NAME)
+ sudo cp $(NAME).dtx $(LOCAL)/source/latex/$(NAME)
+ sudo cp $(NAME).%ext% $(LOCAL)/tex/latex/$(NAME)
+ sudo cp $(NAME).pdf $(LOCAL)/doc/latex/$(NAME)
+zip: all
+ ln -sf . $(NAME)
+ zip -Drq $(PWD)/$(NAME)-$(VERS).zip $(NAME)/{README,$(NAME).{pdf,dtx}}
+ rm $(NAME)
+Makefile
+
+:<<'DTX'
+% \iffalse meta-comment
+% vim: textwidth=75
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+|
+%readme%
+
+Short description:
+Some text about the %typ%: probably the same as the abstract.
+%</readme>
+%<*internal>
+\fi
+\def\nameofplainTeX{plain}
+\ifx\fmtname\nameofplainTeX\else
+ \expandafter\begingroup
+\fi
+%</internal>
+%<*install>
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+%readme%
+\endpreamble
+\postamble
+
+Copyright (C) %year% by %name% <%mail%>
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+%name%.
+
+This work consists of the file %base%.dtx and a Makefile.
+Running "make" generates the derived files README, %base%.pdf and %base%.%ext%.
+Running "make inst" installs the files in the user's TeX tree.
+Running "make install" installs the files in the local TeX tree.
+
+\endpostamble
+
+\usedir{tex/latex/%base%}
+\generate{
+ \file{\jobname.%ext%}{\from{\jobname.dtx}{%typ%}}
+}
+%</install>
+%<install>\endbatchfile
+%<*internal>
+\usedir{source/latex/%base%}
+\generate{
+ \file{\jobname.ins}{\from{\jobname.dtx}{install}}
+}
+\nopreamble\nopostamble
+\usedir{doc/latex/%base%}
+\generate{
+ \file{README.txt}{\from{\jobname.dtx}{readme}}
+}
+\ifx\fmtname\nameofplainTeX
+ \expandafter\endbatchfile
+\else
+ \expandafter\endgroup
+\fi
+%</internal>
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{%base%.dtx}
+%</driver>
+%<%typ%>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<%typ%>\Provides%Typ%{%base%}
+%<*%typ%>
+ [%date% v1.00 %shrt%]
+%</%typ%>
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[a4paper,margin=25mm,left=50mm,nohead]{geometry}
+\usepackage[numbered]{hypdoc}
+%use%
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{\jobname.dtx}
+% \DoNotIndex{\newcommand,\newenvironment}
+%
+%\title{\textsf{%base%} --- %short%\thanks{This file
+% describes version \fileversion, last revised \filedate.}
+%}
+%\author{%name%\thanks{E-mail: %mail%}}
+%\date{Released \filedate}
+%
+%\maketitle
+%
+%\changes{v1.00}{%date%}{First public release}
+%
+% \begin{abstract}
+% ==== Put abstract text here. ====
+% \end{abstract}
+%
+% \section{Usage}
+%
+% ==== Put descriptive text here. ====
+%
+% \DescribeMacro{\dummyMacro}
+% This macro does nothing.\index{doing nothing|usage} It is merely an
+% example. If this were a real macro, you would put a paragraph here
+% describing what the macro is supposed to do, what its mandatory and
+% optional arguments are, and so forth.
+%
+% \DescribeEnv{dummyEnv}
+% This environment does nothing. It is merely an example.
+% If this were a real environment, you would put a paragraph here
+% describing what the environment is supposed to do, what its
+% mandatory and optional arguments are, and so forth.
+%
+%\StopEventually{^^A
+% \PrintChanges
+% \PrintIndex
+%}
+%
+% \section{Implementation}
+%
+% \begin{macrocode}
+%<*%typ%>
+%lcl%
+% \end{macrocode}
+% \begin{macro}{\dummyMacro}
+% This is a dummy macro. If it did anything, we'd describe its
+% implementation here.
+% \begin{macrocode}
+\newcommand{\dummyMacro}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{dummyEnv}
+% This is a dummy environment. If it did anything, we'd describe its
+% implementation here.
+% \begin{macrocode}
+\newenvironment{dummyEnv}{%
+}{%
+% \end{macrocode}
+% \changes{v1.00a}{%date%}{Added a spurious change log entry to
+% show what a change \emph{within} an environment definition looks
+% like.}
+% Don't use |%| to introduce a code comment within a |macrocode|
+% environment. Instead, you should typeset all of your comments with
+% LaTeX---doing so gives much prettier results. For comments within a
+% macro/environment body, just do an |\end{macrocode}|, include some
+% commentary, and do another |\begin{macrocode}|. It's that simple.
+% \begin{macrocode}
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macrocode}
+\endinput
+%</%typ%>
+% \end{macrocode}
+%\Finale
+DTX
diff --git a/support/dtxgen/dtxgen.pdf b/support/dtxgen/dtxgen.pdf
new file mode 100644
index 0000000000..aceae7ed28
--- /dev/null
+++ b/support/dtxgen/dtxgen.pdf
Binary files differ