diff options
-rw-r--r-- | common/latex.py | 145 | ||||
-rw-r--r-- | common/latex/capt-of.sty | 33 | ||||
-rw-r--r-- | common/latex/environ.sty | 145 | ||||
-rw-r--r-- | common/latex/eqparbox.sty | 280 | ||||
-rw-r--r-- | common/latex/ifplatform.sty | 151 | ||||
-rw-r--r-- | common/latex/inconsolata.sty | 92 | ||||
-rw-r--r-- | common/latex/lato.sty | 47 | ||||
-rw-r--r-- | common/latex/slantsc.sty | 101 | ||||
-rw-r--r-- | common/latex/trimspaces.sty | 58 | ||||
-rw-r--r-- | common/latex/upquote.sty | 40 | ||||
-rw-r--r-- | common/waf.py | 116 |
11 files changed, 1113 insertions, 95 deletions
diff --git a/common/latex.py b/common/latex.py new file mode 100644 index 0000000..186a64f --- /dev/null +++ b/common/latex.py @@ -0,0 +1,145 @@ +# +# Support for Latex used to build the PDF output format. +# + +import os +import platform +import re + +package_test_preamble = ['\\newif\\ifsphinxKeepOldNames \\sphinxKeepOldNamestrue', + '\documentclass[a4paper,11pt,english]{report}'] +package_test_postamble = ['\\begin{document} test \\end{document}'] +package_tests = { + 'Bjarne' : ['\\usepackage[Bjarne]{fncychap}'], + 'alltt' : ['\\usepackage{alltt}'], + 'amsmath' : ['\\usepackage{amsmath}'], + 'amssymb' : ['\\usepackage{amssymb}'], + 'amstext' : ['\\usepackage{amstext}'], + 'array' : ['\\usepackage{array}'], + 'atbegshi' : ['\\usepackage{atbegshi}'], + 'babel' : ['\\usepackage{babel}'], + 'babel' : ['\\usepackage{babel}'], + 'calc' : ['\\usepackage{calc}'], + 'capt-of' : ['\\usepackage{capt-of}'], + 'charter' : ['\\usepackage{charter}'], + 'cmap' : ['\\usepackage{cmap}'], + 'color' : ['\\usepackage{color}'], + 'eqparbox' : ['\\usepackage{eqparbox}'], + 'etoolbox' : ['\\usepackage{etoolbox}'], + 'fancybox' : ['\\usepackage{fancybox}'], + 'fancyhdr' : ['\\usepackage{fancyhdr}'], + 'fancyvrb' : ['\\usepackage{fancyvrb}'], + 'float' : ['\\usepackage{float}'], + 'fncychap' : ['\\usepackage{fncychap}'], + 'fontenc' : ['\\usepackage[T1]{fontenc}'], + 'footnote' : ['\\usepackage{footnote}'], + 'framed' : ['\\usepackage{framed}'], + 'graphicx' : ['\\usepackage{graphicx}'], + 'hypcap' : ['\\usepackage{hyperref}', + '\\usepackage{hypcap}'], + 'hyperref' : ['\\usepackage{hyperref}'], + 'ifplatform' : ['\\usepackage{ifplatform}'], + 'ifthen' : ['\\usepackage{ifthen}'], + 'inconsolata' : ['\\usepackage{inconsolata}'], + 'inputenc' : ['\\usepackage{inputenc}'], + 'keyval' : ['\\usepackage{keyval}'], + 'kvoptions' : ['\\usepackage{kvoptions}'], + 'lato' : ['\\usepackage{lato}'], + 'lineno' : ['\\usepackage{lineno}'], + 'longtable' : ['\\usepackage{longtable}'], + 'makeidx' : ['\\usepackage{makeidx}'], + 'multirow' : ['\\usepackage{multirow}'], + 'parskip' : ['\\usepackage{parskip}'], + 'pdftexcmds' : ['\\usepackage{pdftexcmds}'], + 'textcomp' : ['\\usepackage{textcomp}'], + 'threeparttable' : ['\\usepackage{threeparttable}'], + 'times' : ['\\usepackage{times}'], + 'titlesec' : ['\\usepackage{titlesec}'], + 'upquote' : ['\\usepackage{upquote}'], + 'utf8' : ['\\usepackage[utf8]{inputenc}'], + 'wrapfig' : ['\\usepackage{wrapfig}'], + 'xcolor' : ['\\usepackage{xcolor}'], + 'xstring' : ['\\usepackage{xstring}'], +} + +# +# Add per host support. If there is a version clash for the same texlive +# package create a directory, add to that directory and use the path in this +# name here. +# +hosts = { + # All versions of CentOS until told otherwise + 'Linux/centos' : { '.*' : ['capt-of.sty', + 'eqparbox.sty', + 'environ.sty', + 'inconsolata.sty', + 'ifplatform.sty', + 'lato.sty', + 'trimspaces.sty', + 'slantsc.sty', + 'upquote.sty'] } +} + +def tex_test(test): + return os.linesep.join(package_test_preamble + + package_tests[test] + + package_test_postamble) + +def host_name(): + uname = os.uname() + if uname[0] == 'Linux': + distro = platform.dist() + name = '%s/%s' % (uname[0], distro[0]) + version = distro[1] + else: + name = uname[0] + version = uname[2] + return name, version + +def local_packages(): + host, version = host_name() + packages = None + if host in hosts: + for version in list(hosts[host].keys()): + if re.compile(version).match(version) is not None: + packages = hosts[host][version] + return packages + +def configure_tests(conf): + + # + # Using a hint from ita (thank you) : + # https://github.com/waf-project/waf/blob/master/demos/tex/wscript + # + def build_latex_test(bld): + def write_tex_test(tsk): + tsk.outputs[0].write(tex_test(tsk.env.TEST)) + + test = bld.kw['tex_test'] + bld.env.TEST = test + + bld.to_log('%s.tex %s' % (test, '=' * (40 - len(test) + 5))) + bld.to_log(tex_test(test)) + bld.to_log('=' * 40) + + bld(rule = write_tex_test, target = 'main.tex') + bld(features = 'tex', type = 'pdflatex', source = 'main.tex', prompt = 0) + + tests = sorted(package_tests.keys()) + excludes = [p[:p.rfind('.')] for p in local_packages()] + for e in excludes: + if e in tests: + tests.remove(e) + + fails = 0 + for t in tests: + r = conf.test(build_fun = build_latex_test, + msg = "Checking for Tex package '%s'" % (t), + tex_test = t, + okmsg = 'ok', + errmsg = 'not found (please install)', + mandatory = False) + if r is None: + fails += 1 + if fails > 0: + conf.fatal('There are %d Tex package failures. Please fix.' % (fails)) diff --git a/common/latex/capt-of.sty b/common/latex/capt-of.sty new file mode 100644 index 0000000..b40978a --- /dev/null +++ b/common/latex/capt-of.sty @@ -0,0 +1,33 @@ +%% +%% This is file `capt-of.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% capt-of.dtx (with options: `package') +%% ---------------------------------------------------------------------- +%% The capt-off package -- float-style captions outside of floats +%% Copyright (c) 2010 Robin Fairbairns +%% +%% This work may be distributed and/or modified under the conditions of the +%% LaTeX Project Public License, either version 1.3c 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.3c or later is part +%% of all distributions of LaTeX version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `author-maintained'. +%% +%% This work consists of the files capt-of.dtx, capt-of.ins, and README +%% and the derived files footmisc.sty (not distributed from the archive) +%% and footmisc.pdf. +%% ----------------------------------------------------------------------- +%% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{capt-of}% + [2009/12/29 v0.2 + standard captions outside of floats% + ]% $Id: footmisc.dtx,v 4.20 2005/03/17 13:41:58 rf Exp rf10 $ +\newcommand\captionof[1]{\def\@captype{#1}\caption} +\endinput +%% +%% End of file `capt-of.sty'. diff --git a/common/latex/environ.sty b/common/latex/environ.sty new file mode 100644 index 0000000..8cf854b --- /dev/null +++ b/common/latex/environ.sty @@ -0,0 +1,145 @@ +%% +%% This is file `environ.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% environ.dtx (with options: `package') +%% +%% __________________________________ +%% Copyright (C) 2007 Will Robertson +%% +%% License information appended. +%% +%% ^^A Test that \RenewEnvironment works correctly: +\ProvidesPackage{environ}[2014/05/04 v0.3 A new way to define environments] +\RequirePackage{trimspaces} +\def\environbodyname#1{\def\env@BODY{#1}} +\environbodyname\BODY +\def\environfinalcode#1{% + \def\env@finalcode{#1}} +\environfinalcode{\ignorespacesafterend} +\def\longdef@c#1{% + \expandafter\long\expandafter\def\csname#1\endcsname} +\unless\ifdefined\collect@body + \newtoks\@envbody + \def\collect@body#1{% + \@envbody{\expandafter#1\expandafter{\the\@envbody}}% + \edef\process@envbody{\the\@envbody\noexpand\end{\@currenvir}}% + \@envbody={}% + \def\begin@stack{b}% + \begingroup + \expandafter\let\csname\@currenvir\endcsname\collect@@body + \edef\process@envbody{% + \expandafter\noexpand\csname\@currenvir\endcsname}% + \process@envbody + } + \def\push@begins#1\begin#2{% + \ifx\end#2\else + b\expandafter\push@begins + \fi} + \def\addto@envbody#1{% + \global\@envbody\expandafter{\the\@envbody#1}} + \def\collect@@body#1\end#2{% + \edef\begin@stack{% + \push@begins#1\begin\end \expandafter\@gobble\begin@stack}% + \ifx\@empty\begin@stack + \endgroup + \@checkend{#2}% + \addto@envbody{#1}% + \else + \addto@envbody{#1\end{#2}}% + \fi + \process@envbody} +\fi +\long\def\Collect@Body#1{% + \@envbody{\expandafter#1\expandafter{\the\@envbody}}% + \edef\process@envbody{\the\@envbody\noexpand\end{\@currenvir}}% + \@envbody={}% + \def\begin@stack{b}% + \begingroup + \expandafter\let\csname\@currenvir\endcsname\Collect@@Body + \edef\process@envbody{% + \expandafter\noexpand\csname\@currenvir\endcsname}% + \process@envbody +} +\long\def\Push@Begins#1\begin#2{% + \ifx\end#2\else + b\expandafter\Push@Begins + \fi} +\long\def\Addto@Envbody#1{% + \global\@envbody\expandafter{\the\@envbody#1}} +\long\def\Collect@@Body#1\end#2{% + \edef\begin@stack{% + \Push@Begins#1\begin\end\expandafter\@gobble\begin@stack}% + \ifx\@empty\begin@stack + \endgroup + \@checkend{#2}% + \Addto@Envbody{#1}% + \else + \Addto@Envbody{#1\end{#2}}% + \fi + \process@envbody} +\def\NewEnviron{% + \let\env@newenvironment\newenvironment + \env@NewEnviron} +\def\RenewEnviron{% + \let\env@newenvironment\renewenvironment + \env@NewEnviron} +\def\env@NewEnviron#1{% + \@ifnextchar[ + {\env@new@i{#1}} + {\env@new@iii{#1}{}}} +\def\env@new@i#1[#2]{% + \@ifnextchar[ + {\env@new@ii{#1}[#2]} + {\env@new@iii{#1}{[#2]}}} +\def\env@new@ii#1[#2][#3]{% + \env@new@iii{#1}{[#2][#3]}} +\long\def\env@new@iii#1#2#3{% + \@temptokena={\env@new{#1}{#2}{#3}}% + \@ifnextchar[{% + \the\@temptokena + }{% + \expandafter\the\expandafter + \@temptokena\expandafter[\env@finalcode]% + }} +\long\def\env@new#1#2#3[#4]{% + \longdef@c{env@#1@BODY\expandafter}\expandafter{\env@BODY}% + \env@newenvironment{#1}{% + \expandafter\Collect@Body\csname env@#1@parse\endcsname + }{#4}% + \longdef@c{env@#1@parse}##1{% + \csname env@#1@save@env\endcsname##1\env@nil + \csname env@#1@process\endcsname##1\env@nil}% + \expandafter\let\csname env@#1@save@env\endcsname\relax + \expandafter\let\csname env@#1@process\endcsname\relax + \expandafter\newcommand + \csname env@#1@save@env\endcsname#2{% + \expandafter\expandafter\expandafter + \env@save\csname env@#1@BODY\endcsname}% + \expandafter\newcommand + \csname env@#1@process\endcsname#2{#3\env@ignore}% +} +\long\def\env@save#1#2\env@nil{% + \edef#1{% + \unexpanded\expandafter + \expandafter\expandafter{\trim@spaces{#2}}}} +\long\def\env@ignore#1\env@nil{} +%% +%% Copyright (C) 2007-2014 by Will Robertson <wspr81@gmail.com> +%% +%% Distributable under the LaTeX Project Public License, +%% version 1.3c or higher (your choice). The latest version of +%% this license is at: http://www.latex-project.org/lppl.txt +%% +%% This work is "maintained" (as per LPPL maintenance status) +%% by Will Robertson. +%% +%% This work consists of the file environ.dtx +%% and the derived files environ.pdf, +%% environ.sty, and +%% environ.ins. +%% +%% +%% End of file `environ.sty'. diff --git a/common/latex/eqparbox.sty b/common/latex/eqparbox.sty new file mode 100644 index 0000000..2f9749c --- /dev/null +++ b/common/latex/eqparbox.sty @@ -0,0 +1,280 @@ +%% +%% This is file `eqparbox.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% eqparbox.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Copyright (C) 2013 Scott Pakin <scott+eqp@pakin.org> +%% ------------------------------------------------------- +%% +%% This package 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.3c or later is part of all distributions of LaTeX +%% version 2008/05/04 or later. +%% +\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\ProvidesPackage{eqparbox} + [2013/03/15 v4.0 Create equal-widthed boxes] +\newlength{\eqp@tempdima} +\newlength{\eqp@tempdimb} +\def\eqp@taglist{} +\newif\ifeqp@must@rerun +\RequirePackage{array} +\newsavebox{\eqp@tabular@box} +\newsavebox{\eqp@list@box} +\newlength{\eqp@list@indent} +\RequirePackage{environ} +\newcommand*{\eqp@storefont}{% + \xdef\eqp@restorefont{% + \noexpand\usefont{\f@encoding}{\f@family}{\f@series}{\f@shape}% + \noexpand\fontsize{\f@size}{\f@baselineskip}% + \noexpand\selectfont + }% +} +\newcommand{\eqp@settowidth}[2]{% + \begingroup + \global\setbox\eqp@tabular@box=\hbox{% + \def\eqp@endings{}% + \ifx\enditemize\endlist + \g@addto@macro\eqp@endings{\let\enditemize=\endlist}% + \fi + \ifx\endenumerate\endlist + \g@addto@macro\eqp@endings{\let\endenumerate=\endlist}% + \fi + \ifx\enddescription\endlist + \g@addto@macro\eqp@endings{\let\enddescription=\endlist}% + \fi + \renewenvironment{list}[2]{% + \ifnum \@listdepth >5\relax + \@toodeep + \else + \global\advance\@listdepth\@ne + \fi + \rightmargin\z@ + \listparindent\z@ + \itemindent\z@ + \csname @list\romannumeral\the\@listdepth\endcsname + ##2\relax + \renewcommand*{\item}[1][]{% + \mbox{}\\ + \box\eqp@list@box\mbox{} \\ + \sbox\@tempboxa{\makelabel{####1}}% + \ifdim\wd\@tempboxa>\labelwidth + \advance\eqp@list@indent by -\labelwidth + \advance\eqp@list@indent by \wd\@tempboxa + \fi + \hspace*{\eqp@list@indent}% + }% + \hspace*{-\eqp@list@indent}% + \advance\eqp@list@indent by \leftmargin + \advance\eqp@list@indent by \rightmargin + \advance\eqp@list@indent by \itemindent + \global\setbox\eqp@list@box=\hbox\bgroup + \begin{tabular}{@{}l@{}}% + }{% + \item[]% + \end{tabular}% + \egroup + \global\advance\@listdepth\m@ne + }% + \eqp@endings + \global\let\eqp@par=\par + \eqp@storefont + \begin{tabular}{@{}>{\eqp@restorefont}l<{\eqp@storefont}@{}}% + \global\@setpar{\\}% + #2% + \\ \box\eqp@list@box + \end{tabular}% + \global\@restorepar + }% + \endgroup + \settowidth{#1}{\box\eqp@tabular@box}% +} +\long\def\eqp@compute@width#1#2{% + \eqp@settowidth{\eqp@tempdimb}{#2}% + \@ifundefined{eqp@minwd@#1}{}{% + \ifdim\eqp@tempdimb<\csname eqp@minwd@#1\endcsname + \eqp@tempdimb=\csname eqp@minwd@#1\endcsname + \fi + }% + \@ifundefined{eqp@maxwd@#1}{}{% + \ifdim\eqp@tempdimb>\csname eqp@maxwd@#1\endcsname + \eqp@tempdimb=\csname eqp@maxwd@#1\endcsname + \fi + }% + \expandafter + \ifx\csname eqp@this@#1\endcsname\relax + \global\eqp@must@reruntrue + \expandafter\xdef\csname eqp@this@#1\endcsname{\the\eqp@tempdimb}% + \expandafter\xdef\csname eqp@next@#1\endcsname{\the\eqp@tempdimb}% + \else + \eqp@tempdima=\csname eqp@this@#1\endcsname\relax + \ifdim\eqp@tempdima<\eqp@tempdimb + \expandafter\xdef\csname eqp@this@#1\endcsname{\the\eqp@tempdimb}% + \global\eqp@must@reruntrue + \fi + \eqp@tempdima=\csname eqp@next@#1\endcsname\relax + \ifdim\eqp@tempdima<\eqp@tempdimb + \expandafter\xdef\csname eqp@next@#1\endcsname{\the\eqp@tempdimb}% + \fi + \fi + \@ifundefined{eqp@seen@#1}{% + \expandafter\gdef\csname eqp@seen@#1\endcsname{}% + \@cons\eqp@taglist{{#1}}% + }{}% + \eqp@tempdima=\csname eqp@this@#1\endcsname\relax + \eqp@produce@box{\eqp@tempdima}{#2}% +} +\DeclareRobustCommand{\eqparbox}{% + \@ifnextchar[%] + {\eqparbox@i}% + {\eqparbox@iii[c][\relax][s]}% +} +\def\eqparbox@i[#1]{% + \@ifnextchar[%] + {\eqparbox@ii[#1]}% + {\eqparbox@iii[#1][\relax][s]}% +} +\def\eqparbox@ii[#1][#2]{% + \@ifnextchar[%] + {\eqparbox@iii[#1][#2]}% + {\eqparbox@iii[#1][#2][#1]}% +} +\def\eqparbox@iii[#1][#2][#3]{% + \long\gdef\eqp@produce@box##1##2{% + \parbox[#1][#2][#3]{##1}{##2}% + }% + \eqp@compute@width +} +\DeclareRobustCommand{\eqminipage}{% + \@ifnextchar[%] + {\eqminipage@i}% + {\eqminipage@iii[c][\relax][s]}% +} +\let\endeqpminipage=\relax +\long\def\eqminipage@i[#1]{% + \@ifnextchar[%] + {\eqminipage@ii[#1]}% + {\eqminipage@iii[#1][\relax][s]}% +} +\def\eqminipage@ii[#1][#2]{% + \@ifnextchar[%] + {\eqminipage@iii[#1][#2]}% + {\eqminipage@iii[#1][#2][#1]}% +} +\def\eqminipage@iii[#1][#2][#3]#4{% + \long\def\eqminipage@iv##1{% + \long\gdef\eqp@produce@box####1####2{% + \begin{minipage}[#1][#2][#3]{####1}% + ####2% + \end{minipage}% + }% + \eqp@compute@width{#4}{##1}% + }% + \Collect@Body\eqminipage@iv +} +\DeclareRobustCommand{\eqmakebox}{% + \@ifnextchar[%] + {\eqlrbox@i\makebox}% + {\makebox}% +} +\DeclareRobustCommand{\eqframebox}{% + \@ifnextchar[%] + {\eqlrbox@i\framebox}% + {\framebox}% +} +\DeclareRobustCommand{\eqsavebox}[1]{% + \@ifnextchar[%] + {\eqlrbox@i{\savebox{#1}}}% + {\savebox{#1}}% +} +\def\eqlrbox@i#1[#2]{% + \@ifnextchar[%] + {\eqlrbox@ii{#1}[#2]}% + {\eqlrbox@ii{#1}[#2][c]}% +} +\def\eqlrbox@ii#1[#2][#3]{% + \long\gdef\eqp@produce@box##1##2{% + #1[##1][#3]{##2}% + }% + \eqp@compute@width{#2}% +} +\newcommand*{\eqboxwidth}[1]{% + \@ifundefined{eqp@this@#1}{0pt}{\csname eqp@this@#1\endcsname}% +} +\newcommand{\eqsetminwidth}[2]{% + \@tempdima=#2\relax + \expandafter\xdef\csname eqp@minwd@#1\endcsname{\the\@tempdima}% +} +\newcommand{\eqsetmaxwidth}[2]{% + \@tempdima=#2\relax + \expandafter\xdef\csname eqp@maxwd@#1\endcsname{\the\@tempdima}% +} +\newcommand{\eqsetminwidthto}[2]{% + \eqp@settowidth{\@tempdima}{#2}% + \expandafter\xdef\csname eqp@minwd@#1\endcsname{\the\@tempdima}% +} +\newcommand{\eqsetmaxwidthto}[2]{% + \eqp@settowidth{\@tempdima}{#2}% + \expandafter\xdef\csname eqp@maxwd@#1\endcsname{\the\@tempdima}% +} +\AtEndDocument{% + \begingroup + \def\@elt#1{% + \@ifundefined{eqp@minwd@#1}{}{% + \@ifundefined{eqp@maxwd@#1}{}{% + \ifdim\csname eqp@minwd@#1\endcsname>\csname eqp@maxwd@#1\endcsname + \PackageWarning{eqparbox}{For tag `#1', + minimum width (\csname eqp@minwd@#1\endcsname) > + maximum width (\csname eqp@maxwd@#1\endcsname)}% + \fi + }% + }% + \eqp@tempdima\csname eqp@this@#1\endcsname\relax + \eqp@tempdimb\csname eqp@next@#1\endcsname\relax + \ifdim\eqp@tempdima=\eqp@tempdimb + \else + \@latex@warning@no@line{Rerun to correct the width of eqparbox `#1'}% + \fi + \immediate\write\@auxout{% + \string\expandafter\string\gdef\string\csname\space + eqp@this@#1\string\endcsname{% + \csname eqp@next@#1\endcsname + }% + ^^J% + \string\expandafter\string\gdef\string\csname\space + eqp@next@#1\string\endcsname{0pt}% + }% + \@ifundefined{eqp@minwd@#1}{}{% + \immediate\write\@auxout{% + \string\expandafter\string\gdef\string\csname\space + eqp@minwd@#1\string\endcsname{% + \csname eqp@minwd@#1\endcsname + }% + }% + }% + \@ifundefined{eqp@maxwd@#1}{}{% + \immediate\write\@auxout{% + \string\expandafter\string\gdef\string\csname\space + eqp@maxwd@#1\string\endcsname{% + \csname eqp@maxwd@#1\endcsname + }% + }% + }% + }% + \eqp@taglist + \endgroup + \ifeqp@must@rerun + \@latex@warning@no@line{Rerun to correct eqparbox widths} + \fi +} +\endinput +%% +%% End of file `eqparbox.sty'. diff --git a/common/latex/ifplatform.sty b/common/latex/ifplatform.sty new file mode 100644 index 0000000..7f59f61 --- /dev/null +++ b/common/latex/ifplatform.sty @@ -0,0 +1,151 @@ +%% +%% This is file `ifplatform.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% ifplatform.dtx (with options: `package') +%% ________________________________________________________ +%% Copyright (C) 2007-2010 Will Robertson & Johannes Große +%% License information appended. +\ProvidesPackage{ifplatform} + [2010/10/22 v0.4 Testing for the operating system] +\RequirePackage{pdftexcmds,catchfile,ifluatex} +\newif\ifshellescape +\newif\ifwindows +\newif\ifmacosx +\newif\iflinux +\newif\ifcygwin +\newcommand\windowsname{Windows} +\newcommand\notwindowsname{*NIX} +\newcommand\linuxname{Linux} +\newcommand\macosxname{Mac\,OS\,X} +\newcommand\cygwinname{Cygwin} +\newcommand\unknownplatform{[Unknown]} +\edef\ip@file{\jobname.w18} +\newif\if@ip@nix@ +\ifnum\pdf@shellescape=1\relax + \shellescapetrue +\else + \ifluatex\else + \PackageWarningNoLine{ifplatform}{^^J \space\space\space + shell escape is disabled, + so I can only detect \@backslashchar ifwindows% + } + \fi +\fi +\def\ip@cantdecide{% + \PackageWarningNoLine{ifplatform}{^^J \space\space\space + I can't tell if this is Windows or *nix; + you appear to be both% + }% +} +\ifluatex + \csname\directlua{ + if os.type == "unix" then + tex.sprint("@ip@nix@true") + elseif os.type == "windows" then + tex.sprint("windowstrue") + end + }\endcsname +\else +\IfFileExists{nul:}{\@ip@nix@false}{\@ip@nix@true} +\IfFileExists{/dev/null}{\windowsfalse}{\windowstrue} +\edef\ip@windows@echo@test{echo \string# > "\ip@file"} +\def\ip@backupplan{% + \IfFileExists{\ip@file}{% + \PackageWarningNoLine{ifplatform}{^^J \space\space\space + Please delete the file "\ip@file" and try again% + }% + \ip@cantdecide + }{% + \immediate\write18{\ip@windows@echo@test}% + \IfFileExists{\ip@file}{% + \immediate\write18{del "\ip@file"}% + \windowstrue + }{% + \@ip@nix@true + }% + }% +} +\ifwindows + \if@ip@nix@ + \PackageWarningNoLine{ifplatform}{^^J \space\space\space + I can't tell if this is Windows or *nix; + you appear to be neither% + } + \fi +\else + \if@ip@nix@\else + \ifshellescape + \ip@backupplan + \else + \ip@cantdecide + \fi + \fi +\fi +\fi +\def\ip@only@six#1#2#3#4#5#6#7\@nil{#1#2#3#4#5#6} +\if@ip@nix@ +\ifshellescape + \ifwindows\else + \immediate\write18{uname -s > "\ip@file"} + \CatchFileDef\@tempa{\ip@file}{} + \immediate\write18{rm -- "\ip@file"} + \edef\@tempa{\expandafter\zap@space\@tempa\@empty} + \def\@tempb{Linux} + \ifx\@tempa\@tempb + \linuxtrue + \else + \def\@tempb{Darwin} + \ifx\@tempa\@tempb + \macosxtrue + \else + \def\@tempb{CYGWIN} + \edef\@tempc{\expandafter\ip@only@six\@tempa------\@nil} + \ifx\@tempb\@tempc + \cygwintrue + \else + \edef\unknownplatform{\@tempa} + \fi + \fi + \fi + \fi +\fi\fi +\edef\platformname{% + \ifwindows + \noexpand\windowsname + \else + \ifshellescape + \iflinux + \noexpand\linuxname + \else + \ifmacosx + \noexpand\macosxname + \else + \ifcygwin + \noexpand\cygwinname + \else + \noexpand\unknownplatform + \fi + \fi + \fi + \else + \noexpand\notwindowsname + \fi + \fi +} +%% Copyright (C) 2007-2010 by Will Robertson & Johannes Große +%% +%% Distributable under the LaTeX Project Public License, +%% version 1.3c or higher (your choice). The latest version of +%% this license is at: http://www.latex-project.org/lppl.txt +%% +%% This work is "author-maintained" by Will Robertson. +%% +%% This work consists of the file ifplatform.dtx +%% and the derived files ifplatform.pdf, +%% ifplatform.sty, and +%% ifplatform.ins. +%% +%% End of file `ifplatform.sty'. diff --git a/common/latex/inconsolata.sty b/common/latex/inconsolata.sty new file mode 100644 index 0000000..aeada49 --- /dev/null +++ b/common/latex/inconsolata.sty @@ -0,0 +1,92 @@ +% Copyright 2014 Michael Sharpe +% Based initially on Karl Berry's inconsolata.sty. +% You may freely use, modify and/or distribute this file. + +\def\fileversion{1.10} +\def\filedate{2016/02/22} +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{inconsolata}[\filedate\space v\fileversion] +\message{`inconsolata-zi4' v\fileversion, \filedate\space Text macros for Inconsolata (msharpe)} + +\RequirePackage{textcomp} +\RequirePackage{keyval} + +\newcount\zifour@ocount +\newif\ifzifour@altzero +\newif\ifzifour@noupq +\define@key{zifour}{scaled}[1.0]{\def\zifour@scaled{s*[#1]}} + +\DeclareOption*{% + \begingroup + \edef\x{\endgroup + \noexpand\setkeys{zifour}{\CurrentOption}}% + \x} + +% by default, change \tt to mean zi4. +\newcommand*{\zifour@default}{% + \renewcommand*{\ttdefault}{zi4}% +} + +% option [nott] to avoid changing tt. +\DeclareOption{nott}{% + \renewcommand*{\zifour@default}{}% +} +% option [noupquote] to prevent loading upquote. +\DeclareOption{noupquote}{% + \zifour@noupqtrue}% + +% option var0---use unslashed zero (slashed is default) +\DeclareOption{var0}{% + \zifour@altzerotrue\advance\zifour@ocount \tw@ % +} +\DeclareOption{varl}{% + \advance\zifour@ocount \@ne % +} +\DeclareOption{varqu}{% + \advance\zifour@ocount 4\relax % +} + +\ProcessOptions* +\zifour@default +\edef\zifour@opt{\the\zifour@ocount} +\ifzifour@altzero + \advance\zifour@ocount -\tw@ +\else + \advance\zifour@ocount \tw@ +\fi +\edef\zifour@altopt{\the\zifour@ocount} +% define an \altzero macro which flips to slashed, unslashed +\def\altzero{{\fontfamily{zi4}% + \fontshape{scit}% + \selectfont 0}} + +\def\zifour@T@ne@nc{T1} +\def\zifour@OT@ne@nc{OT1} +\def\zifour@LY@ne@nc{LY1} +\def\zifour@QX@nc{QX} +\def\zifour@TQS{% +\UndeclareTextCommand{\textquotesingle}{\encodingdefault} +\DeclareTextSymbol{\textquotesingle}{TS1}{39}} + +\ifzifour@noupq% do nothing + % Try to correct for wrong slots for QX + \ifx\encodingdefault\zifour@QX@nc + \zifour@TQS + \else + \ifx\encodingdefault\zifour@LY@ne@nc + \zifour@TQS + \fi + \fi +\else + \AtBeginDocument{% + \ifx\encodingdefault\zifour@T@ne@nc % do nothing + \else + \ifx\encodingdefault\zifour@OT@ne@nc % do nothing + \else + \zifour@TQS + \fi + \fi + \usepackage{upquote}} +\fi + +\endinput diff --git a/common/latex/lato.sty b/common/latex/lato.sty new file mode 100644 index 0000000..ba947cc --- /dev/null +++ b/common/latex/lato.sty @@ -0,0 +1,47 @@ +%% lato.sty +%% Copyright 2011 Mohamed El Morabity +% +% This work may be distributed and/or modified under the conditions of the LaTeX +% Project Public License, either version 1.3 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.3 or later is part of all +% distributions of LaTeX version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Mohamed El Morabity +% +% This work consists of all files listed in manifest.txt. + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{lato}[2011/08/06 Lato] + +\RequirePackage{keyval} +\RequirePackage{slantsc} + +% Taken from inconsolata.sty +\define@key{lato}{scale}[1.0]{\def\lato@scale{s*[#1]}} +\DeclareOption*{% + \begingroup% + \edef\x{\endgroup% + \noexpand\setkeys{lato}{\CurrentOption}}% + \x% +} + +\DeclareOption{defaultsans}{% + \renewcommand*{\sfdefault}{fla}% +} + +\DeclareOption{default}{% + \renewcommand*{\familydefault}{fla}% + \renewcommand*{\sfdefault}{fla}% +} + +\ProcessOptions* + +\newcommand{\flafamily}{% + \fontfamily{fla}% + \selectfont% +} + +\endinput diff --git a/common/latex/slantsc.sty b/common/latex/slantsc.sty new file mode 100644 index 0000000..d9139f6 --- /dev/null +++ b/common/latex/slantsc.sty @@ -0,0 +1,101 @@ +%% +%% This is file `slantsc.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% slantsc.dtx (with options: `package') +%% +%% slantsc package +%% +%% Copyright 2003, 2012 Harald Harders +%% +%% This program can be redistributed and/or modified under the terms +%% of the LaTeX Project Public License Distributed from CTAN +%% archives in directory macros/latex/base/lppl.txt; either +%% version 1 of the License, or any later version. +%% +%% harald.harders@gmx.de +%% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{slantsc} + [2012/01/01 v2.11 Provide Slanted an Italic Small Caps] +\RequirePackage{ifthen} +\DeclareFontFamily{T1}{cmr}{} +\DeclareFontShape{T1}{cmr}{m}{scsl}% +{<5><6><7><8><9><10><10.95><12><14.4>% + <17.28><20.74><24.88><29.86><35.83>genb*ecsc}{} +\DeclareFontShape{T1}{cmr}{bx}{scsl}% +{<5><6><7><8><9><10><10.95><12><14.4>% + <17.28><20.74><24.88><29.86><35.83>genb*ecoc}{} +\DeclareFontShape{T1}{cmr}{m}{scit}{<->ssub * cmr/m/scsl}{} +\DeclareFontShape{T1}{cmr}{bx}{scit}{<->ssub * cmr/bx/scsl}{} +\providecommand*\scitdefault{\scdefault\itdefault} +\providecommand*\scsldefault{\scdefault\sldefault} +\DeclareRobustCommand\upshape{% + \not@math@alphabet\upshape\relax + \ifthenelse{\equal{\f@shape}{\scdefault}\or + \equal{\f@shape}{\scitdefault}\or\equal{\f@shape}{\scsldefault}}{% + \fontshape\scdefault + }{% + \fontshape\updefault + }% + \selectfont +} +\DeclareRobustCommand\slshape{% + \not@math@alphabet\slshape\relax + \ifthenelse{\equal{\f@shape}{\scdefault}\or + \equal{\f@shape}{\scitdefault}\or\equal{\f@shape}{\scsldefault}}{% + \fontshape\scsldefault + }{% + \fontshape\sldefault + }% + \selectfont +} +\DeclareRobustCommand\itshape{% + \not@math@alphabet\itshape\relax + \ifthenelse{\equal{\f@shape}{\scdefault}\or + \equal{\f@shape}{\scitdefault}\or\equal{\f@shape}{\scsldefault}}{% + \fontshape\scitdefault + }{% + \fontshape\itdefault + }% + \selectfont +} +\DeclareRobustCommand\scshape{% + \not@math@alphabet\scshape\relax + \ifthenelse{\equal{\f@shape}{\scdefault}\or + \equal{\f@shape}{\scitdefault}\or\equal{\f@shape}{\scsldefault}}{% + }{% + \ifthenelse{\equal{\f@shape}{\itdefault}}{% + \fontshape\scitdefault + }{% + \ifthenelse{\equal{\f@shape}{\sldefault}}{% + \fontshape\scsldefault + }{% + \fontshape\scdefault + }% + }% + }% + \selectfont +} +\DeclareRobustCommand\noscshape{% + \not@math@alphabet\noscshape\relax + \ifthenelse{\equal{\f@shape}{\scdefault}\or + \equal{\f@shape}{\scitdefault}\or\equal{\f@shape}{\scsldefault}}{% + \ifthenelse{\equal{\f@shape}{\scitdefault}}{% + \fontshape\itdefault + }{% + \ifthenelse{\equal{\f@shape}{\scsldefault}}{% + \fontshape\sldefault + }{% + \fontshape\updefault + }% + }% + }{% + }% + \selectfont +} +\endinput +%% +%% End of file `slantsc.sty'. diff --git a/common/latex/trimspaces.sty b/common/latex/trimspaces.sty new file mode 100644 index 0000000..d576156 --- /dev/null +++ b/common/latex/trimspaces.sty @@ -0,0 +1,58 @@ +%% LaTeX2e file `trimspaces.sty' +%% generated by the `filecontents' environment +%% from source `trimspaces' on 2016/11/06. +%% +\ProvidesPackage{trimspaces}[2009/09/17 v1.1 + Trim spaces around a token list] + +% Trimming surrounding spaces: +\catcode`\Q=3 +\newcommand\trim@spaces[1]{% + \romannumeral-`\q\trim@trim@\noexpand#1Q Q% +} +\long\def\trim@trim@#1 Q{\trim@trim@@#1Q} +\long\def\trim@trim@@#1Q#2{#1} +\catcode`\Q=11 + +\newcommand\trim@spaces@noexp[1]{% + \unexpanded\expandafter\expandafter\expandafter + {\trim@spaces{#1}}% +} + +\newcommand\trim@spaces@in[1]{% + \edef#1{\expandafter\trim@spaces@noexp\expandafter{#1}}% +} + +% Trimming preceding spaces: +\newcommand\trim@pre@space[1]{% + \romannumeral-`\.\expandafter\noexpand#1% +} + +\newcommand\trim@pre@space@noexp[1]{% + \unexpanded\expandafter{% + \romannumeral-`\.\expandafter\noexpand#1% + }% +} + +\newcommand\trim@pre@space@in[1]{% + \expandafter\def\expandafter#1\expandafter{% + \romannumeral-`\.\expandafter\noexpand#1% + }% +} + +% Trimming trailing space: +\catcode`\Q=3 +\newcommand\trim@post@space[1]{\trim@trim@#1Q Q} +\catcode`\Q=11 + +\newcommand\trim@post@space@noexp[1]{% + \unexpanded\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\expandafter + {\trim@post@space{#1}}% +} + +\newcommand\trim@post@space@in[1]{% + \edef#1{\expandafter\trim@post@space@noexp\expandafter{#1}}% +} + +% That's it. diff --git a/common/latex/upquote.sty b/common/latex/upquote.sty new file mode 100644 index 0000000..6b9d754 --- /dev/null +++ b/common/latex/upquote.sty @@ -0,0 +1,40 @@ +%% +%% This is file `upquote.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% upquote.dtx (with options: `package') +%% +%% Copyright (C) 2000 by Michael A. Covington +%% Copyright (C) 2003 by Frank Mittelbach +%% Copyright (C) 2012 by Markus Kuhn (current maintainer) +%% +%% Released under the LaTeX Project Public License v1.3c or later +%% See http://www.latex-project.org/lppl.txt +%% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{upquote} + [2012/04/19 v1.3 upright-quote and grave-accent glyphs in verbatim] +\newcommand\upquote@cmtt{cmtt} +\newcommand\upquote@OTone{OT1} +\ifx\encodingdefault\upquote@OTone + \ifx\ttdefault\upquote@cmtt\else\RequirePackage{textcomp}\fi +\else + \RequirePackage{textcomp} +\fi +\begingroup +\catcode`'=\active +\catcode``=\active +\g@addto@macro\@noligs + {\let'\textquotesingle + \let`\textasciigrave + \ifx\encodingdefault\upquote@OTone + \ifx\ttdefault\upquote@cmtt + \def'{\char13 }% + \def`{\char18 }% + \fi\fi} +\endgroup +\endinput +%% +%% End of file `upquote.sty'. diff --git a/common/waf.py b/common/waf.py index 25f3d74..0086be0 100644 --- a/common/waf.py +++ b/common/waf.py @@ -1,6 +1,8 @@ import sys, os, re from waflib.Build import BuildContext +import latex + sphinx_min_version = (1, 3) def cmd_spell(ctx): @@ -86,6 +88,23 @@ def build_dir_setup(ctx, buildtype): doctrees = os.path.join(os.path.dirname(output_dir), 'doctrees', buildtype) return build_dir, output_node, output_dir, doctrees +def pdf_resources(ctx, buildtype): + local_packages = latex.local_packages() + if local_packages is not None: + packages_base = ctx.path.parent.find_dir('common/latex') + if packages_base is None: + ctx.fatal('Latex package directory not found') + base = packages_base.path_from(ctx.path) + srcs = [os.path.join(base, p) for p in local_packages] + fnode = ctx.path.get_bld().make_node(buildtype) + fnode.mkdir() + ctx( + features = "subst", + is_copy = True, + source = srcs, + target = [fnode.make_node(p) for p in local_packages] + ) + def html_resources(ctx, buildtype): for dir_name in ["_static", "_templates"]: files = ctx.path.parent.find_node("common").ant_glob("%s/*" % dir_name) @@ -108,100 +127,6 @@ def html_resources(ctx, buildtype): # target = [x.srcpath().replace("../", "") for x in files] # ) -def latex_configure_tests(conf): - - # - # Using a hint from ita (thank you) : - # https://github.com/waf-project/waf/blob/master/demos/tex/wscript - # - latex_test_preamble = ['\\newif\\ifsphinxKeepOldNames \\sphinxKeepOldNamestrue', - '\documentclass[a4paper,11pt,english]{report}'] - latex_test_postamble = ['\\begin{document} test \\end{document}'] - latex_tests = { - 'Bjarne' : ['\\usepackage[Bjarne]{fncychap}'], - 'alltt' : ['\\usepackage{alltt}'], - 'amsmath' : ['\\usepackage{amsmath}'], - 'amssymb' : ['\\usepackage{amssymb}'], - 'amstext' : ['\\usepackage{amstext}'], - 'array' : ['\\usepackage{array}'], - 'atbegshi' : ['\\usepackage{atbegshi}'], - 'babel' : ['\\usepackage{babel}'], - 'babel' : ['\\usepackage{babel}'], - 'calc' : ['\\usepackage{calc}'], - 'capt-of' : ['\\usepackage{capt-of}'], - 'charter' : ['\\usepackage{charter}'], - 'cmap' : ['\\usepackage{cmap}'], - 'color' : ['\\usepackage{color}'], - 'eqparbox' : ['\\usepackage{eqparbox}'], - 'etoolbox' : ['\\usepackage{etoolbox}'], - 'fancybox' : ['\\usepackage{fancybox}'], - 'fancyhdr' : ['\\usepackage{fancyhdr}'], - 'fancyvrb' : ['\\usepackage{fancyvrb}'], - 'float' : ['\\usepackage{float}'], - 'fncychap' : ['\\usepackage{fncychap}'], - 'fontenc' : ['\\usepackage[T1]{fontenc}'], - 'footnote' : ['\\usepackage{footnote}'], - 'framed' : ['\\usepackage{framed}'], - 'graphicx' : ['\\usepackage{graphicx}'], - 'hypcap' : ['\\usepackage{hyperref}', - '\\usepackage{hypcap}'], - 'hyperref' : ['\\usepackage{hyperref}'], - 'ifplatform' : ['\\usepackage{ifplatform}'], - 'ifthen' : ['\\usepackage{ifthen}'], - 'inconsolata' : ['\\usepackage{inconsolata}'], - 'inputenc' : ['\\usepackage{inputenc}'], - 'keyval' : ['\\usepackage{keyval}'], - 'kvoptions' : ['\\usepackage{kvoptions}'], - 'lato' : ['\\usepackage{lato}'], - 'lineno' : ['\\usepackage{lineno}'], - 'longtable' : ['\\usepackage{longtable}'], - 'makeidx' : ['\\usepackage{makeidx}'], - 'multirow' : ['\\usepackage{multirow}'], - 'parskip' : ['\\usepackage{parskip}'], - 'pdftexcmds' : ['\\usepackage{pdftexcmds}'], - 'textcomp' : ['\\usepackage{textcomp}'], - 'threeparttable' : ['\\usepackage{threeparttable}'], - 'times' : ['\\usepackage{times}'], - 'titlesec' : ['\\usepackage{titlesec}'], - 'upquote' : ['\\usepackage{upquote}'], - 'utf8' : ['\\usepackage[utf8]{inputenc}'], - 'wrapfig' : ['\\usepackage{wrapfig}'], - 'xcolor' : ['\\usepackage{xcolor}'], - 'xstring' : ['\\usepackage{xstring}'], - } - - def build_latex_test(bld): - def create_tex(test_data): - return os.linesep.join(latex_test_preamble + - test_data + - latex_test_postamble) - def write_tex_test(tsk): - tex = create_tex(tsk.env.TEST_DATA) - tsk.outputs[0].write(tex) - - test = bld.kw['tex_test'] - bld.env.TEST = test - bld.env.TEST_DATA = latex_tests[test] - - bld.to_log('%s.tex %s' % (test, '=' * (40 - len(test) + 5))) - bld.to_log(create_tex(latex_tests[test])) - bld.to_log('=' * 40) - - bld(rule = write_tex_test, target = 'main.tex') - bld(features = 'tex', type = 'pdflatex', source = 'main.tex', prompt = 0) - - fails = 0 - for t in sorted(latex_tests.keys()): - r = conf.test(build_fun = build_latex_test, - msg = "Checking for Tex package '%s'" % (t), - tex_test = t, - okmsg = 'ok', - errmsg = 'not found (please install)', - mandatory = False) - if r is None: - fails += 1 - if fails > 0: - conf.fatal('There are %d Tex package failures. Please fix.' % (fails)) def cmd_configure(ctx): ctx.find_program("sphinx-build", var="BIN_SPHINX_BUILD", mandatory = True) @@ -232,7 +157,7 @@ def cmd_configure(ctx): if 'PDFLATEXFLAGS' not in ctx.env or \ '-shell-escape' not in ctx.env['PDFLATEXFLAGS']: ctx.env.append_value('PDFLATEXFLAGS', '-shell-escape') - latex_configure_tests(ctx) + latex.configure_tests(ctx) else: ctx.msg('Check for Tex packages', 'skipping, already checked') ctx.env.BUILD_PDF = 'yes' @@ -248,6 +173,7 @@ def cmd_configure(ctx): def doc_pdf(ctx, source_dir, conf_dir): buildtype = 'latex' build_dir, output_node, output_dir, doctrees = build_dir_setup(ctx, buildtype) + pdf_resources(ctx, buildtype) rule = "${BIN_SPHINX_BUILD} %s -b %s -c %s -d %s %s %s" % \ (sphinx_verbose(ctx), buildtype, conf_dir, doctrees, source_dir, output_dir) |