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/templatetools/README | 25 + .../latex/contrib/templatetools/templatetools.dtx | 857 +++++++++++++++++++++ .../latex/contrib/templatetools/templatetools.ins | 29 + .../latex/contrib/templatetools/templatetools.pdf | Bin 0 -> 441431 bytes 4 files changed, 911 insertions(+) create mode 100644 macros/latex/contrib/templatetools/README create mode 100644 macros/latex/contrib/templatetools/templatetools.dtx create mode 100644 macros/latex/contrib/templatetools/templatetools.ins create mode 100644 macros/latex/contrib/templatetools/templatetools.pdf (limited to 'macros/latex/contrib/templatetools') diff --git a/macros/latex/contrib/templatetools/README b/macros/latex/contrib/templatetools/README new file mode 100644 index 0000000000..856eb584c4 --- /dev/null +++ b/macros/latex/contrib/templatetools/README @@ -0,0 +1,25 @@ +templatetools +============= +New conditional commands helpful for LaTeX templates + +== Description == + +Collection of tools, which are helpful for the creation of +a LaTeX template if conditional paths for code execution +are required. +All commands work in the preamble and in the document. + + +== Contents == + +This work contains: +- The templatetools files: + - templatetools.dtx + - templatetools.ins +- The documentation: + - templatetools.pdf +- This README file + +== Maintained by == +Matthias Pospiech +matthias@pospiech.eu \ No newline at end of file diff --git a/macros/latex/contrib/templatetools/templatetools.dtx b/macros/latex/contrib/templatetools/templatetools.dtx new file mode 100644 index 0000000000..7cecc11565 --- /dev/null +++ b/macros/latex/contrib/templatetools/templatetools.dtx @@ -0,0 +1,857 @@ +% \iffalse meta-comment +% !TeX spellcheck = en-US +% +% File: templatetools.sty +% Version: 2014/06/27 v0.1 +% Author: Matthias Pospiech +% Email: +% +% Copyright (C) 2014 by Matthias Pospiech +% --------------------------------------------------------------------------- +% 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 Matthias Pospiech. +% +% This work consists of the files templatetools.dtx and templatetools.ins +% and the derived filebase templatetools.sty. +% +% \fi +% +% \iffalse +%<*driver> +\ProvidesFile{templatetools.dtx} +% +%\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%\ProvidesPackage{templatetools} +%<*package> + [2014/06/27 v0.1 Collection of conditional commands useful inside templates] +% +% +%<*driver> +\documentclass{ltxdoc} +\usepackage{hypdoc} +\RequirePackage[% + loadHyperref=true, + createIndexEntries=false, + applyLayout=true] +{doctools} % +% +\usepackage{lmodern} + +\usepackage{templatetools}[2014/06/27] + +\EnableCrossrefs % (default) Every new macro name used within a macrocode or + % macrocode∗ environment will produce an index entry. +% \DisableCrossrefs % turn off this feature +% +% If an index is created is determined by the use of the following +% declarations in the driver file preamble; if neither is used, no index is +% produced. +\PageIndex % all index entries refer to their page number +% \CodelineIndex % index entries produced by \DescribeMacro and \DescribeEnv + % refer to page number but those produced by the macro + % environment refer to the code lines, + % which will be numbered automatically. +% \CodelineNumbered % no index is created, but the code lines are numbered + +\RecordChanges + + +\begin{document} + \DocInput{templatetools.dtx} + \PrintChanges + \PrintIndex +\end{document} +% +% \fi +% +% \CheckSum{0} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% +% \changes{v0.1}{2014/06/27}{Converted to DTX file} +% +% \DoNotIndex{\newcommand,\newenvironment} +% +% \providecommand*{\url}{\texttt} +% \GetFileInfo{templatetools.dtx} +% \title{The \textsf{templatetools} package} +% \author{Matthias Pospiech \\ \url{matthias@pospiech.eu}} +% \date{\fileversion~from \filedate} +% +% \maketitle +% \begin{abstract}\noindent +% Collection of tools, which are helpful for the creation of a \LaTeX{} +% template if conditional paths for code execution are required. +% \end{abstract} +% +% \section{Usage} +% +% \subsection{Commands} +% The following commands check if a command sequence is defined or not. +% +% \DescribeMacro{\IfDefined} \marg{command}\marg{code defined} \AfterLastParam +% Executes the code if the command is defined. +% +% +% \DescribeMacro{\IfUndefined} \marg{command}\marg{code undefined} +% \AfterLastParam +% Executes the code if the command is not defined. +% +% \DescribeMacro{\IfElseDefined} \marg{command}\marg{defined}\marg{undefined} +% \AfterLastParam +% Executes either the code in the \emph{defined} bracket if the command is +% defined or in the \emph{undefined} bracket if the code is undefined. +% +% \DescribeMacro{\IfElseUndefined} \marg{command}\marg{undefined}\marg{defined} +% \AfterLastParam +% As \cs{IfElseDefined}, but with switched brackets for defined and undefined. +% +% +% \subsubsection{Example} +% The \cs{usepackage} code is only executed if the required \cs{upmu} command +% is defined. +% \iffalse +%<*example> +% \fi +\begin{lstlisting}[style=lstDemoStyleLaTeXCode] +% Requires: Command \upmu +\IfDefined{upmu}{\usepackage[upmu]{gensymb}} +\end{lstlisting} +% \iffalse +% +% \fi +% +% +% \DescribeMacro{\IfMultDefined} +% \marg{list of commands}\marg{defined}\marg{undefined} \AfterLastParam +% Checks a comma separated list of commands before it executes the defined +% code path if all commands were defined or the undefined code path else. +% +% \subsubsection{Example} +% \iffalse +%<*example> +% \fi +\begin{lstlisting}[style=lstDemoStyleLaTeXCode] +% Requires: Command longtable and rowcolors +\IfMultDefined{longtable,rowcolors} + {... longtable with rowcolors ...} + {Error: Neither longtable nor rowcolors are defined} +\end{lstlisting} +% \iffalse +% +% \fi +% +% \subsection{Draft mode} +% +% The following commands check if draft mode is active or not. +% +% \DescribeMacro{\IfDraft}\marg{draft mode active} +% \AfterLastParam +% +% \DescribeMacro{\IfNotDraft}\marg{draft mode disabled} +% \AfterLastParam +% +% \DescribeMacro{\IfNotDraftElse}\marg{draft mode disabled}\marg{draft mode active} +% \AfterLastParam +% +% \subsubsection{Example} +% The \package{bookmark} is not loaded in draft mode: +% \iffalse +%<*example> +% \fi +\begin{lstlisting}[style=lstDemoStyleLaTeXCode] +\IfNotDraft{\usepackage[]{bookmark}} +\end{lstlisting} +% \iffalse +% +% \fi +% +% +% \subsection{Packages} +% +% These commands check if a package was loaded or not. +% This can be achieved in different ways with commands from other packages. +% The key point of these commands here is that they work not only in +% the preamble and include no @-char. +% +% \DescribeMacro{\IfPackageLoaded}\marg{package}\marg{is loaded} +% \AfterLastParam +% +% \DescribeMacro{\IfPackageNotLoaded}\marg{package}\marg{is not loaded} +% \AfterLastParam +% +% \DescribeMacro{\IfPackagesLoaded}\marg{list of packages}\marg{all are loaded} +% \AfterLastParam +% +% \DescribeMacro{\IfPackagesNotLoaded}\marg{list of packages}\marg{none is loaded} +% \AfterLastParam +% +% \subsubsection{Example} +% +% \iffalse +%<*example> +% \fi +\begin{lstlisting}[style=lstDemoStyleLaTeXCode] +% Load epstopdf only if graphicx was loaded +\IfPackageLoaded{graphicx}{% + \usepackage{epstopdf} +} +% Do not load subcaption if subfig was loaded (incompatible) +\IfPackageNotLoaded{subfig}{ + \usepackage{subcaption}[2011/08/17] +} +\end{lstlisting} +% \iffalse +% +% \fi +% +% +% \subsection{Package Loading order} +% In \latex{} documents it is quite often essential +% to load packages in the right order to ensure that everything works. +% However this makes it impossible to group similar packages together. +% +% The following commands allow to execute code after or before a +% specified package and thus also allows to load packages in a specified order +% using \cs{usepackage} commands. +% +% If the reference package was not loaded in the preamble +% the code will nevertheless be executed before \texttt{\cs{begin}\{document\}} +% +% +% \DescribeMacro{\ExecuteAfterPackage} +% \marg{after this package}\marg{execute this code}\AfterLastParam +% +% \DescribeMacro{\ExecuteBeforePackage} +% \marg{before this package}\marg{execute this code}\AfterLastParam +% +% \subsubsection{Example} +% \package{cleveref} package must be loaded after package \package{hyperref}. +% +% \iffalse +%<*example> +% \fi +\begin{lstlisting}[style=lstDemoStyleLaTeXCode] +% loading: must be loaded after hyperref and after varioref +\ExecuteAfterPackage{hyperref}{ +% caption and cleveref incompatible in Versions before 2011/12/24 + \usepackage{cleveref}[2011/12/24] +} +\end{lstlisting} +% \iffalse +% +% \fi +% +% \subsection{Tikz Library} +% Checks if a tikz library was loaded. +% +% \DescribeMacro{\IfTikzLibraryLoaded}\marg{library}\marg{if loaded} +% +% +% \subsubsection{Example} +% Executes the code only of the tikz library was loaded. +% +% \iffalse +%<*example> +% \fi +\begin{lstlisting}[style=lstDemoStyleLaTeXCode] +\IfTikzLibraryLoaded{lindenmayersystems}{% +% code origin: pgf/tikz manual +\begin{tikzpicture} +\pgfdeclarelindenmayersystem{Koch curve}{ + \rule{F -> F-F++F-F} +} +\shadedraw [top color=white, bottom color=blue!50, draw=blue!50!black] + [l-system={Koch curve, step=2pt, angle=60, axiom=F++F++F, order=3}] + lindenmayer system -- cycle; +\end{tikzpicture} +}% +\end{lstlisting} +% \iffalse +% +% \fi +% +% \subsection{Column types} +% +% \LaTeX{} provides no tool to check for the existence of a column type. +% This is provided by the following commands: +% +% \DescribeMacro{\IfColumntypeDefined}\marg{columntype character}\marg{is +% defined}\marg{is undefined} \AfterLastParam +% +% ^^A which is also available as a command checking a comma separated list for +% ^^A column type characters +% +% \DescribeMacro{\IfColumntypesDefined} +% \marg{columntype character list}\marg{is defined}\marg{is undefined} +% \AfterLastParam +% +% \subsubsection{Example} +% Executes the code only of the X column type is defined and the tabularx package was +% loaded by checking that \cs{tabularx} is defined. +% +% \iffalse +%<*example> +% \fi +\begin{lstlisting}[style=lstDemoStyleLaTeXCode] +\IfColumntypeDefined{X}{% +\IfDefined{tabularx}{% +% +\begin{tabularx}{0.9\textwidth}{llXX} +\hline +l & l & X & X \\\hline +% +left column & left column & +text which is considerably longer than the width of the column & +text which is considerably longer than the width of the column \\ +\hline +\end{tabularx} +% +}}% +\end{lstlisting} +% \iffalse +% +% \fi + +% \subsection{Color definitions} +% +% Color definitions are saved in \latex{} as names. The following commands +% provide a convenient way to check the existence of these color definitions. +% +% \DescribeMacro{\IfColorDefined} +% \marg{color name}\marg{is defined}\marg{is undefined} \AfterLastParam +% +% +% \DescribeMacro{\IfColorsDefined} +% \marg{list of color name}\marg{is defined}\marg{is undefined} \AfterLastParam +% +% \subsection{Math font version} +% \DescribeMacro{\IfMathVersionDefined} +% \marg{font version}\marg{is defined}\marg{is undefined} \AfterLastParam +% +% +% \subsection{Glossaries styles} +% \DescribeMacro{\IfGlossariesStyleDefined} +% \marg{style name}\marg{is defined} \AfterLastParam +% +% +% \subsection{Template Definitions} +% The following commands in principle define only macros, but in contrast to +% normal methods these are saved using two keys named \emph{group} +% and \emph{property}. With a matching command for the execution this +% allows to generate macros in an object like naming structure, which +% can be used to toggle settings. +% +% \DescribeMacro{\SetTemplateDefinition} \marg{Group}\marg{Property}\marg{Code} +% \AfterLastParam +% Defines a collection of commands (a macro) with a \emph{group} and +% \emph{property}. +% +% \DescribeMacro{\UseDefinition} \marg{Group}\marg{Property} \AfterLastParam +% Execute macro save with the \emph{group} and \emph{property}. +% +% \subsubsection{Example} +% The following code allows to switch the colors anywhere in the document: +% +% \iffalse +%<*example> +% \fi +\begin{lstlisting}[style=lstDemoStyleLaTeXCode] +\SetTemplateDefinition{Target}{Web}{% + \definecolor{pdfurlcolor}{rgb}{0,0,0.6} +}% +\SetTemplateDefinition{Target}{Print}{% + \definecolor{pdfurlcolor}{rgb}{0,0,0} +}% +% Apply colors for web +\UseDefinition{Target}{Web} +\end{lstlisting} +% \iffalse +% +% \fi +% +% \StopEventually{} +% \clearpage +% \section{Implementation} +% +% \iffalse +%<*templatetools.sty> +% \fi +% +% +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1994/12/01] +\ProvidesPackage{templatetools} + [2014/06/27 v0.1 Collection of conditional commands useful inside templates] +% \end{macrocode} +% \begin{macrocode} +%%% --- Necessary Packages +%%% ------------------------------------------------------------------ +\RequirePackage{ifpdf} +\RequirePackage{etoolbox} +\RequirePackage{ltxcmds} +\RequirePackage{array} % for column types +\RequirePackage{ifdraft} % check draft +\RequirePackage{scrlfile} +% \end{macrocode} +% +% \subsection{Command sequences} +% +% \iffalse +%%% --- Check if command is defined +%%% ------------------------------------------------------------------ +% \fi +% +% +% \begin{macro}{\IfDefined} +% Wrapper to \cs{ifcsdef} with only true path. +% \begin{macrocode} +\newcommand{\IfDefined}[2]{\ifcsdef{#1}{#2}{}}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\IfUndefined} +% Wrapper to \cs{ifcsdef} with only false path. +% \begin{macrocode} +\newcommand{\IfUndefined}[2]{\ifcsdef{#1}{}{#2}}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\IfElseDefined} +% Wrapper to \cs{ifcsdef} with true and false path. +% \begin{macrocode} +\newcommand{\IfElseDefined}[3]{\ifcsdef{#1}{#2}{#3}}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\IfElseUndefined} +% Wrapper to \cs{ifcsdef} with true and false path in reverse order. +% \begin{macrocode} +\newcommand{\IfElseUndefined}[3]{\ifcsdef{#1}{#3}{#2}}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\IfMultDefined} +% Checks if more than one command is defined +% \begin{macrocode} +\newcommand{\IfMultDefined}[1]{% + \@tempswatrue + \def\do##1{% +%% define \@tempa with trimmed index element. + \edef\@tempa{\zap@space##1 \@empty}% +%% check if package of current index is loaded + \ifcsdef{\@tempa}{}{\@tempswafalse}% + }% +%% Process csv list with command \do (etoolbox) + \docsvlist{#1}% +%% makes sure that the conditional works with one or two (if, else) parameters. + \if@tempswa\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi% +} +% \end{macrocode} +% \end{macro} +% +% Thanks to \person{egreg,Andrey Vihrov, Martin Scharrer} on +%\href{http://tex.stackexchange.com/questions/35282/how-to-implement-a-command-that-checks-for-loaded-packages}{tex.stackexchange.com} +% for the help to implement a command that checks a comma separated list. +% +% \subsection{Draft mode} +% +% \iffalse +% ------------------------------------------------------------------ +% Check for 'draft' mode - commands. +% ------------------------------------------------------------------ +% \fi +% +% +% \begin{macro}{\IfDraft} +% Tests if \cs{@draft} is undefined and executed false path in case draft string +% is defined. +% \begin{macrocode} +\newcommand{\IfDraft}[1]{\ifx\@draft\@undefined \else #1 \fi} +% \end{macrocode} +% \end{macro} + +% +% \begin{macro}{\IfNotDraft} +% Similar to \cs{IfDraft} but executes only path for draft mode undefined. +% \begin{macrocode} +\newcommand{\IfNotDraft}[1]{\ifx\@draft\@undefined #1 \fi} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\IfNotDraftElse} +% Similar to \cs{IfDraft} but executes true and fals path. +% \begin{macrocode} +\newcommand{\IfNotDraftElse}[2]{\ifx\@draft\@undefined #1 \else #2 \fi} +% \end{macrocode} +% \end{macro} +% +% +% +% \subsection{Packages} +% +% \iffalse +% ------------------------------------------------------------------ +% Check load status of packages +% ------------------------------------------------------------------ +% \fi +% +% If a package is loaded can be checked in many ways, but here the +% \cs{ltx@ifpackageloaded} is used because it can be executed anywhere +% in the document. +% +% \begin{macro}{\IfPackageLoaded} +% Wrapper to \cs{ltx@ifpackageloaded} with only true path. +% \begin{macrocode} +\newcommand{\IfPackageLoaded}[2]{\ltx@ifpackageloaded{#1}{#2}{}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\IfPackageNotLoaded} +% Wrapper to \cs{ltx@ifpackageloaded} with only false path. +% \begin{macrocode} +\newcommand{\IfPackageNotLoaded}[2]{\ltx@ifpackageloaded{#1}{}{#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\IfElsePackageLoaded\} +% Wrapper to \cs{ltx@ifpackageloaded} +% \begin{macrocode} +\let\IfElsePackageLoaded\ltx@ifpackageloaded +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\IfPackagesLoaded} +% Checks a list of packages +% \begin{macrocode} +\newcommand{\IfPackagesLoaded}[1]{% + \@tempswatrue + \def\do##1{% + \edef\@tempa{\zap@space##1 \@empty}% + \ltx@ifpackageloaded{\@tempa}{}{\@tempswafalse}% + }% + \docsvlist{#1}% + \if@tempswa\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\IfPackagesNotLoaded} +% Invers check if all packages in a list are not loaded +% \begin{macrocode} +\newcommand{\IfPackagesNotLoaded}[1]{% + \@tempswatrue + \def\do##1{% + \edef\@tempa{\zap@space##1 \@empty}% + \ltx@ifpackageloaded{\@tempa}{\@tempswafalse}{}% + }% + \docsvlist{#1}% + \if@tempswa\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\ExecuteAfterPackage} +% Executes the code after the reference package has been loaded (using +% \cs{AfterAtEndOfPackage}) or finally at the end of the preamble +% if the reference package was not loaded until then. +% +% \begin{macrocode} +\newcommand{\ExecuteAfterPackage}[2]{% +%% #1: after this package +%% #2: code to execute + \AfterAtEndOfPackage{#1}{ + #2% + } + \AtEndPreamble{% + \IfPackageNotLoaded{#1}{% + #2% + } + } +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\ExecuteBeforePackage} +% Executes the code directly before the reference package is loaded (using +% \cs{BeforePackage}) or finally at the end of the preamble +% if the reference package was not loaded until then. +% +% \begin{macrocode} +\newcommand{\ExecuteBeforePackage}[2]{% +%% #1: before this package +%% #2: code to execute + \BeforePackage{#1}{ + #2% + } + \AtEndPreamble{% + \IfPackageNotLoaded{#1}{% + #2% + } + } +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Tikz library} +% +% \iffalse +% ------------------------------------------------------------------ +% The command sequence that is created for each tikz library when it is loaded is +% used to check if it is loaded. +% \fi +% +% +% \begin{macro}{\IfTikzLibraryLoaded} +% Checks if the tikz library is loaded +% \begin{macrocode} +\def\IfTikzLibraryLoaded#1{% + \ifcsname tikz@library@#1@loaded\endcsname + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +% \end{macrocode} +% \end{macro} +% +% Thanks to \person{egreg} and \person{Marco Daniel} on \href{http://tex.stackexchange.com/questions/48453/how-to-test-if-tikz-library-is-loaded}{tex.stackexchange.com} for their help with this command. +% +% \subsection{Column types in tables} +% +% \iffalse +% ------------------------------------------------------------------ +% table columns +% ------------------------------------------------------------------ +% \fi +% +% The code in this section was inspired by the discussion with \person{egreg} on \href{http://tex.stackexchange.com/questions/35527/how-to-check-if-a-column-type-is-defined}{tex.stackexchange.com} on the detection of column definitions. +% +% Creates a list of predefined columntypes +% \begin{macrocode} +\expandafter\let\csname columntype@l\endcsname\@empty +\expandafter\let\csname columntype@c\endcsname\@empty +\expandafter\let\csname columntype@r\endcsname\@empty +\expandafter\let\csname columntype@p\endcsname\@empty +\expandafter\let\csname columntype@m\endcsname\@empty +\expandafter\let\csname columntype@b\endcsname\@empty +\expandafter\let\csname columntype@@\endcsname\@empty +\expandafter\let\csname columntype@!\endcsname\@empty +\expandafter\let\csname columntype@|\endcsname\@empty +\expandafter\let\csname columntype@<\endcsname\@empty +\expandafter\let\csname columntype@>\endcsname\@empty +\expandafter\let\csname columntype@=\endcsname\@empty +% \end{macrocode} +% +% \begin{macro}{\CheckIfColumntypeDefined} +% Creates a bool variable that saves the status of the column type. +% \begin{macrocode} +\newcommand\CheckIfColumntypeDefined[1]{% +%% create the bool variable for column type + \providebool{tpl@coltype@#1} +%% check if new column type of this name was created + \ifcsdef{NC@find@\string#1}% + {\setbool{tpl@coltype@#1}{true}}% +%% if not check if it is a predefined column type + {\ifcsdef{columntype@\string#1} + {\setbool{tpl@coltype@#1}{true}}% + {\setbool{tpl@coltype@#1}{false}}% + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\isColumntypeDefined} +% Returns the bool variable which can be interpreted by \cs{ifboolexpr}. +% This should only be used internally and fails for nonexistent bool variables. +% \begin{macrocode} +\newcommand\isColumntypeDefined[1]{tpl@coltype@#1} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\IfColumntypeDefined} +% Executes \cs{CheckIfColumntypeDefined} and uses the resulting bool +% variable with \cs{isColumntypeDefined} in a conditional sequence with +% \cs{ifboolexpr}. +% \begin{macrocode} +\newcommand\IfColumntypeDefined[3]{% +%% Execute check which create bool variable + \CheckIfColumntypeDefined{#1} +%% use bool variable for if sequence + \ifboolexpr{ bool{\isColumntypeDefined{#1}} }{#2}{#3}% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\IfColumntypesDefined} +% Checks a comma separated list instead of a single string. +% \begin{macrocode} +\newcommand{\IfColumntypesDefined}[1]{% + \@tempswatrue + \def\do##1{% + \edef\@tempa{\zap@space##1 \@empty}% +%% check if column is defined. +%% Here with \expandafter because of the \string definition +%% in \CheckIfColumntypeDefined. + \expandafter\IfColumntypeDefined + \expandafter{\@tempa}{}{\@tempswafalse} + }% + \docsvlist{#1}% + \if@tempswa\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi% +} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Color definitions} +% +% \iffalse +% ------------------------------------------------------------------ +% test color definitions +% ------------------------------------------------------------------ +% \fi +% +% +% \begin{macro}{\IfColorDefined} +% Tests if a color is defined +% \begin{macrocode} +\newcommand{\IfColorDefined}[3]{% + \ifcsdef{\string\color @#1} + {#2} % color string is defined + {#3}} % color string is not defined +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\IfColorsDefined} +% Does the same for a list (comma separated) of color names. +% \begin{macrocode} +\newcommand{\IfColorsDefined}[1]{% + \@tempswatrue + \def\do##1{% + \edef\@tempa{\zap@space##1 \@empty}% + \expandafter\IfColorDefined + \expandafter{\@tempa}{}{\@tempswafalse} + }% + \docsvlist{#1}% + \if@tempswa\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi% +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Math font version} +% +% \iffalse +% ------------------------------------------------------------------ +% test math versions +% ------------------------------------------------------------------ +% \fi +% +% \begin{macro}{\IfMathVersionDefined} +% Checks if a mathversion font is defined. +% \begin{macrocode} +\newcommand{\IfMathVersionDefined}[3]{\ifcsdef{mv@#1}{#2}{#3}} +% \end{macrocode} +% \end{macro} +% +% Thanks to \person{Werner} and \person{Ulrike Fischer} for pointing me to this +% name definition on +% \href{http://tex.stackexchange.com/questions/40903/check-if-mathversion-font-is-defined}{tex.stackexchange.com}. +% +% +% \subsection{Glossaries styles} +% +% \iffalse +% ------------------------------------------------------------------ +% tests the existens of glossaries styles +% ------------------------------------------------------------------ +% \fi +% +% \begin{macro}{\IfGlossariesStyleDefined} +% Checks if a glossaries style is defined. +% \begin{macrocode} +\newcommand{\IfGlossariesStyleDefined}[2]{\ifcsdef{@glsstyle@#1}{#2}{}} +% \end{macrocode} +% \end{macro} +% +% Thanks to \person{cgnieder} on +%\href{http://tex.stackexchange.com/questions/95639/test-if-a-listings-or-glossaries-style-is-valid}{tex.stackexchange.com} +% for the help to implement the command. + + +% \subsection{Template definitions} +% +% \iffalse +% ------------------------------------------------------------------ +% template definitions +% ------------------------------------------------------------------ +% \fi +% +% +% \begin{macro}{\SetTemplateDefinition} +% Defines a macro with the \emph{group} and \emph{property} parameter names. +% \begin{macrocode} +\newcommand\SetTemplateDefinition[3]{% 1: group, 2: property, 3: code + \csdef{tpl@definition@#1@#2}{#3} +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\UseDefinition} +% Executes the macro using \cs{csuse} if it is defined. Otherwise a warning is +% thrown. +% \begin{macrocode} +\newcommand\UseDefinition[2]{% + \ifcsdef{tpl@definition@#1@#2} + {\csuse{tpl@definition@#1@#2}} + {\PackageWarning{templatetools}% + {Definition #1->#2 is unknown\MessageBreak}{}}% +}% +% \end{macrocode} +% \end{macro} +% +% +% \iffalse +% +% \fi +% +% \Finale +\endinput + diff --git a/macros/latex/contrib/templatetools/templatetools.ins b/macros/latex/contrib/templatetools/templatetools.ins new file mode 100644 index 0000000000..933c2c1eab --- /dev/null +++ b/macros/latex/contrib/templatetools/templatetools.ins @@ -0,0 +1,29 @@ +% See file 'templatetools.dtx' for copyright and licence. + +\input docstrip.tex +\keepsilent +\askforoverwritefalse + +\usedir{tex/latex/templatetools} + +\generate{ + \file{templatetools.sty}{\from{templatetools.dtx}{templatetools.sty}} +} + +\obeyspaces +\Msg{*************************************************************} +\Msg{* *} +\Msg{* To finish the installation you have to move the following *} +\Msg{* file into a directory searched by TeX: *} +\Msg{* *} +\Msg{* templatetools.sty *} +\Msg{* *} +\Msg{* To produce the documentation run the file *} +\Msg{* templatetools.dtx *} +\Msg{* through LaTeX. *} +\Msg{* *} +\Msg{* Happy TeXing! *} +\Msg{* *} +\Msg{*************************************************************} + +\endbatchfile diff --git a/macros/latex/contrib/templatetools/templatetools.pdf b/macros/latex/contrib/templatetools/templatetools.pdf new file mode 100644 index 0000000000..9febccfab4 Binary files /dev/null and b/macros/latex/contrib/templatetools/templatetools.pdf differ -- cgit v1.2.3