diff --git a/lvspec.cls b/lvspec.cls index 23c8178..3307db4 100644 --- a/lvspec.cls +++ b/lvspec.cls @@ -20,6 +20,8 @@ % base class, defaulting to 10pt \LoadClass[10pt]{scrreprt} +\RequirePackage{xparse} + \RequirePackage[top=4.5cm,bottom=5cm,width=\textwidth]{geometry} \RequirePackage{makeidx} \RequirePackage{minitoc} diff --git a/raterspec.cls b/raterspec.cls index 7a6c9fa..4edbf27 100644 --- a/raterspec.cls +++ b/raterspec.cls @@ -69,19 +69,28 @@ % The host environment is the same for all new systems % -\def\@raterspec@input@types{ - \PackageWarning{raterspec}{Missing program-specific input parameter types! - \MessageBreak Define using \protect\inputtypes} - \todo{No input parameter types have been defined.} +\let\@@madespec0 + +\def\@raterspec@mkhook#1#2#3#4{ + \expandafter\gdef\csname @raterspec@#1\endcsname{ + \PackageWarning{raterspec}{Missing #2! + \MessageBreak Define using \expandafter\protect\csname#1\endcsname}% + \todo{No #2 have been defined.}% + }% + \expandafter\gdef\csname#1\endcsname##1{% + \expandafter\gdef\csname @raterspec@#1\endcsname{% + #3\input{##1}#4% + }% + }% } -\def\@raterspec@input@params{ - \PackageWarning{raterspec}{Missing input parameters! - \MessageBreak Define using \protect\inputparams} - \todo{No input parameters have been defined.} -} +\def\makespec{ + \ifx\@@madespec1% + \PackageError{raterspec}{Duplicate call to \protect\makespec} + \fi + + \global\let\@@madespec1 -\def\@lvspec@posttitle{ \pnumoff\part{General System}\pnumon \chapter{Host Environment} @@ -95,36 +104,38 @@ \section{Program-Specific Parameter Types} \sectiondept{it/uw} - \@raterspec@input@types + \@raterspec@inputtypes \index{input data|)} \chapter{Input Parameters} \index{input data!parameters|(} \index{parameter|(} \input{raterspec/sec/params} - \@raterspec@input@params + \@raterspec@inputparams \index{input data!parameters|)} \index{parameter|)} } -\def\inputtypes#1{ - \gdef\@raterspec@input@types{ +\@raterspec@mkhook{inputtypes}{input types} + {% % can't really include a sigline here because approvial would be global \pnumoff Parameter types in this section are common to the \@title@short\ program. \pnumon \index{parameter type|(} - \input{#1} - \index{parameter type|)} } -} + {\index{parameter type|)}} -\def\inputparams#1{ - \gdef\@raterspec@input@params{ - \input{#1} - } +\@raterspec@mkhook{inputparams}{input parameters} + {} + {} + +\AtEndDocument{ + \ifx\@@madespec0 + \PackageError{raterspec}{\protect\makespec\space was not called} + \fi } diff --git a/raterspec/param.sty b/raterspec/param.sty index 7065cd4..9857a78 100644 --- a/raterspec/param.sty +++ b/raterspec/param.sty @@ -24,6 +24,11 @@ \edef\@root{\@ptype@root#1<||}% \edef\@type{\@ptype@type#1<#1>||}% \expandafter\gdef\csname ptype@#2\endcsname{#3}% + % place definition into aux file; will be available next pass + \protected@write\@auxout{}{% + \string\expandafter\string\gdef + \string\csname\space ptype@#2\string\endcsname{#3}% + }% % typeset definition with link \item[% \hypertarget{@ptype:#2}{#2}% @@ -35,7 +40,7 @@ % ensure that the parent type actually exists \ifx\@root\@coreptype\else% \expandafter\ifx\csname ptype@\@type\endcsname\relax% - \errmessage{unknown parent param type `\@type' for `#2'} + \PackageWarning{raterspec}{unknown parent param type `\@type' for `#2'} \fi% \fi% % process any keywords @@ -76,6 +81,13 @@ % define constant \expandafter\gdef\csname const@#2\endcsname{#1}% \expandafter\gdef\csname const@value@#2\endcsname{#3}% + % place definition into aux file; will be available next pass + \protected@write\@auxout{}{% + \string\expandafter\string\gdef + \string\csname\space const@#2\string\endcsname{#1}% + \string\expandafter\string\gdef + \string\csname\space constvalue@#2\string\endcsname{#3}% + }% % typeset \index{constant!{\tt#2}}% {\tt\hypertarget{@const:#2}{#2}} & $#3$ & #1 \\ @@ -99,7 +111,7 @@ \def\unionv#1{% % does this type exist? \expandafter\ifx\csname ptype@#1\endcsname\relax% - \errmessage{unknown param type `#1' for union} + \PackageWarning{raterspec}{unknown param type `#1' for union} \fi% \item{\typeref{#1}} } @@ -152,7 +164,7 @@ \def\@type@exists@err#1{{% \expandafter\let\expandafter\@chk\csname ptype@#1\endcsname \ifx\@chk\relax - \errmessage{parameter `#1' is undefined}% + \PackageWarning{raterspec}{parameter `#1' is undefined}% \fi }} \def\@const@exists@err#1{{% @@ -160,7 +172,7 @@ \@ifnumeric{#1}\else \expandafter\let\expandafter\@chk\csname const@#1\endcsname \ifx\@chk\relax - \errmessage{constant `#1' is undefined}% + \PackageWarning{raterspec}{constant `#1' is undefined}% \fi \fi }} @@ -197,10 +209,15 @@ \edef\@root{\@ptype@root#1<||}% \edef\@type{\@ptype@type#1<#1>||}% \expandafter\gdef\csname param@#2\endcsname{#3}% + % place definition into aux file; will be available next pass + \protected@write\@auxout{}{% + \string\expandafter\string\gdef + \string\csname\space param@#2\string\endcsname{#3}% + }% % does the given type exist (note that this check assumes that the typedef % appears before the param in the specs, as is currently the case) \expandafter\ifx\csname ptype@\@type\endcsname\relax% - \errmessage{unknown param type: \@type} + \PackageWarning{raterspec}{unknown param type: \@type} \fi% % typeset definition with link \item[% @@ -240,7 +257,7 @@ \endlinechar-1\relax \expandafter\let\expandafter\@@chk\csname param@#1\endcsname \ifx\@@chk\relax - \PackageError{dwspec}{unknown param: #1} + \PackageWarning{raterspec}{unknown param: #1} \fi \index{parameter!#1@\texttt{#1}}% \hyperlink{@param:#1}% @@ -252,7 +269,7 @@ \def\paramrefd#1{% \expandafter\let\expandafter\@@pchk\csname param@#1\endcsname \ifx\@@pchk\empty - \PackageError{dwspec}{Unknown parameter: #1}% + \PackageWarning{raterspec}{Unknown parameter: #1}% \else % output \@@pchk diff --git a/raterspec/sec/input.tex b/raterspec/sec/input.tex index 52a1510..59d2cce 100644 --- a/raterspec/sec/input.tex +++ b/raterspec/sec/input.tex @@ -76,6 +76,7 @@ parameter types}. \typedef core int: Any signed 32-bit integer + \end{description} \index{parameter type|)}