% \iffalse meta-comment % % backnaur.dtx % 7 June 2019 % % Documented LaTeX file for the backnaur package. % % Run LaTeX on backnaur.ins to make the package's % backnaur.sty file. % % Run LaTeX on this file to produce the package % documentation. % % Copyright (C) 2019 by Adrian P Robson % adrian.robson@nepsweb.co.uk % % 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 % % This work has the LPPL maintenance status `maintained'. % % The Current Maintainer of this work is Adrian Robson. % % This work consists of the files backnaur.dtx and % backnaur.ins % and the derived files backnaur.sty and % backnaur.pdf % ----------------------------------------------------------- % \fi % % \iffalse %\NeedsTeXFormat{LaTeX2e}[2011/06/27] %\ProvidesPackage{backnaur} %[2019/06/18 3.1 Typesetting for Backus-Naur Form (BNF) definitions] %<*driver> \documentclass[10pt,a4paper]{ltxdoc} \usepackage{backnaur} \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{textcomp} \usepackage{bigstrut} \EnableCrossrefs \CodelineIndex \RecordChanges \OnlyDescription % comment out for code implementation \begin{document} \DocInput{backnaur.dtx} \end{document} % % \fi % %^^A------------------------------------------------------------------- %^^A Change log... %^^A-------------- %^^A %^^A 15 November 2012 %^^A The original was based on a non-packaged version that was used %^^A in 2008 for the LaTeX editions of the author's foggy times %^^A reports. % \changes{v1.0}{2012/11/15} % {Initial version of the package.} %^^A %^^A 3 December 2012 %^^A Add tstt option and generally rewrite documentation. % \changes{v1.1}{2012/12/12} % {Updated and improved documentation.} % %^^A %^^A 7 June 2019 %^^A Remove tstt option, add line number management, add altpo option %^^A and updated and improve documentation. % \changes{v3.0}{2019/06/07} % {Updated and improved documentation.} % %^^A------------------------------------------------------------------- % % \CheckSum{0} %^^A no checksum for development %^^A \CheckSum{80} % % \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 \~} % % \GetFileInfo{backnaur.sty} % % \title{The \texttt{backnaur} package} % \author{Adrian P. Robson\thanks{\texttt{adrian.robson@nepsweb.co.uk}}} % \date{Version 3.1\\[0.5ex]18 June 2019} % % \maketitle % %^^A------------------------------------------------------------------- %^^A Start report body %^^A------------------------------------------------------------------- % % \section{Introduction} % % The \texttt{backnaur} package typesets Backus-Naur Form (BNF) definitions. % It creates aligned lists of productions, with numbers if required. % It can also print in line BNF expressions using math mode. % % Backus-Naur Form is a notation for defining context free grammars. % It is used to describe such things as programming languages, communication protocols % and command syntaxes, but it can be useful whenever a rigorous definition of language is needed. % % \section{BNF Definitions} % % The following is a BNF definition of a semicolon separated list: % \begin{bnf*} % \bnfprod{list} % {\bnfpn{listitems} \bnfor \bnfes}\\ % \bnfprod{listitems} % {\bnfpn{item} \bnfor \bnfpn{item} % \bnfsp \bnfts{;} \bnfsp \bnfpn{listitems}}\\ % \bnfprod{item} % { \bnftd{description of item}} % \end{bnf*} % % \noindent % Here, $\bnfpo$ signifies \emph{produces}, $\mid$ is an \emph{or} operator, $\langle$...$\rangle$ % are \emph{production names}, % and $\bnfes$ represents the \emph{empty string}. % However, some BNF users prefer alternative terminologies, % where $\bnfpo$ stands for \emph{is defined as}, % $\langle$...$\rangle$ is a \emph{category name} or \emph{nonterminal}, % and $\bnfes$ is refered to as \emph{null} or \emph{empty}. % % The above definition was created with the following code: % %\begin{verbatim} %\usepackage{backnaur} %... %\begin{bnf*} % \bnfprod{list} % {\bnfpn{listitems} \bnfor \bnfes}\\ % \bnfprod{listitems} % {\bnfpn{item} \bnfor \bnfpn{item} % \bnfsp \bnfts{;} \bnfsp \bnfpn{listitems}}\\ % \bnfprod{item} % {\bnftd{description of item}} %\end{bnf*} % %\end{verbatim} % % \noindent % Each BNF production is defined by a |\bnfprod| command, which has two arguments % giving its left and right sides. % The right hand side of each production is specified with the commands described in % \S\ref{prodef} below. % Terminal (|\bnfts{;}|) and nonterminal (|\bnfpn{item}|), elements are separated % by spaces (|\bnfsp|) and OR symbols (|\bnfor|). % The |\bnfes| command gives the symbol for the empty string. % % \section{Package Commands}\label{commandDesc} % % \subsection{Loading and options}\label{packopts} % % The package is loaded with % % \medskip\noindent % \hspace{2.5em}|\usepackage{backnaur}| \\ % or\\ % \hspace*{2.5em}|\usepackage[||]{backnaur}| % \medskip % % \noindent % Possible options are % % \vspace{-1.5ex} % \begin{tabbing} % xxxxxxxxx \=\kill % |perp| \>The empty string symbol is $\perp$\\ % |epsilon| \> The empty string symbol is $\epsilon$\\ % |tsrm| \> Terminal string typeface is roman\\ % |altpo| \> Production operator is $::=$ %^^A |tstt| \> Terminal string typeface is typewriter (default) % \end{tabbing} % \vspace{-1ex} % % \noindent % The defaults are: the empty string symbol is $\lambda$, % the production operator is $\models$, % and the terminal string typeface is typewriter. % % \subsection{Environments} % % \DescribeEnv{bnf} % BNF productions are defined in a |bnf| or |bnf*| environment, % which respectively give numbered or unnumbered lists of productions. % \DescribeEnv{bnf*} % \begin{quote} % \begin{minipage}{0.5\linewidth} % |\begin{bnf}|\\ % \hspace*{1em}\\ % |\end{bnf}| % \end{minipage} % \begin{minipage}{0.45\linewidth} % |\begin{bnf*}|\\ % \hspace*{1em}\\ % |\end{bnf*}| % \end{minipage} % \end{quote} % % \subsection{Productions} % % \DescribeMacro{\bnfprod} % \DescribeMacro{\bnfprod*} % A production is defined by |\bnfprod| or |\bnfprod*|, % which respectively give a numbered or unnumbered line in the {\tt bnf} environment. % They have identical unnumbered behaviour in the {\tt bnf*} enviromment. % They take two arguments: % \begin{quote} % |\bnfprod{||}{||}|\\ % |\bnfprod*{||}{||}| % \end{quote} % % \DescribeMacro{\bnfmore} % \DescribeMacro{\bnfmore*} % A production can be continued on addition lines by |\bnfmore| or |\bnfmore*|, % which respectively give a numbered or unnumbered line in the {\tt bnf} environment. % They are treated the same in the {\tt bnf*} environment. % They take one arguments: % \begin{quote} % |\bnfmore{||}|\\ % |\bnfmore*{||}| % \end{quote} % % \subsection{Production definitions}\label{prodef} % % The following commands are used to compose the right hand side of a production. % They are deployed in the second argument of the |\bnfprod| command. % % \DescribeMacro{\bnfpn} % The |\bnfpn| command generates a production name. % It takes a single argument that is the name. % It is used as follows: % \begin{quote} % \begin{minipage}{0.6\linewidth} % |\bnfpn{list item}| % \end{minipage} % \begin{minipage}{0.3\linewidth} % $\bnfpn{list item}$ % \end{minipage} % \end{quote} % % There are three types of terminal item: a literal string, a descriptive phrase and an empty string. % \DescribeMacro{\bnftm} % A literal terminal string is specified by the |\bnftm| command, which takes a single argument. % By default literal terminal strings are printed in typewriter font, but this can be changed as a package option (see \S\ref{packopts}). % \DescribeMacro{\bnftd} % The |\bnftd| command generates a descriptive phrase, as an alternative to a literal string. % \DescribeMacro{\bnfes} % The |\bnfes| command generates a token that represents the empty string. % This is normally $\bnfes$, but it can be changed to $\epsilon$ or $\perp$ as a package option % (see \S\ref{packopts}). % \begin{quote} % \begin{minipage}{0.6\linewidth} % |\bnfts{terminal}|\\ % |\bnftd{description}|\\ % |\bnfes| % \end{minipage} % \begin{minipage}{0.3\linewidth} % $\bnfts{terminal}$\\ % $\bnftd{description}$\\ % $\bnfes$ % \end{minipage} % \end{quote} % % \DescribeMacro{\bnfsk} % Some literal terminal strings can be abbreviated with the `skip' token, % which is generated by the |\bnfsk| command. % This substitutes for a sequence of terminal characters. % It is used like this: % \begin{quote} % \begin{minipage}{0.6\linewidth} % |\bnfts{A} \bnfsk \bnfts{Z}| % \end{minipage} % \begin{minipage}{0.3\linewidth} % $\bnfts{A} \bnfsk \bnfts{Z}$ % \end{minipage} % \end{quote} % % \DescribeMacro{\bnfor} % All items should be separated by an OR or a space. % The |\bnfor| command generates the OR symbol, and the |\bnfsp| command introduces a space. % \DescribeMacro{\bnfsp} % A space can be considered equivalent to an AND operator. % \begin{quote} % \begin{minipage}{0.6\linewidth} % |\bnfpn{abc} \bnfor \bnfts{xzy}|\\ % |\bnfpn{abc} \bnfsp \bnfts{xzy}| % \end{minipage} % \begin{minipage}{0.3\linewidth} % $\bnfpn{abc} \bnfor \bnfts{xzy}$\\ % $\bnfpn{abc} \bnfsp \bnfts{xzy}$ % \end{minipage} % \end{quote} % % \subsection{Inline expressions} % The |\bnfprod| and |\bnfmore| macros cannot be used inline, so the |\bnfpn| and |\bnfpo| macros % are provided to support typeseting productions inline using maths mode. % \DescribeMacro{\bnfpn} % \DescribeMacro{\bnfpo} % The production's name can be typeset with |\bnfpn{name}| and the production operator with % |\bnfpo|. % By default the production operator is $\bnfpo$, but it can be changed to $::=$ with % a package option (see \S\ref{packopts}). % The right side of the production can be defined with the usual macros (see \S\ref{prodef}). % So |$\bnfpn{name} \bnfpo \bnftd{description}$| gives $\bnfpn{name} \bnfpo \bnftd{description}$. % % \subsection{Command summary} % % The commands that can be used to define a BNF production in a |bnf| or |bnf*| environment % are as follows: % % \begin{center} % \begin{tabular}{lll} % \hline % Command & Operator & Outcome \bigstrut \\ % \hline % |\bnprod| & production line & $\bnfpo$ {\it def} \bigstrut[t] \\ % |\bnmore| & extra line & \hspace{38.8pt} $\bnfpo$ {\it def} \\[1ex] % |\bnfor| & OR operator & $\bnfor$ \\ % |\bnfsk| & skip & $\bnfsk$ \\ % |\bnfsp| & space/AND operator & $\bnfsp$ \\ % |\bnfes| & empty string & $\bnfes$ \\ % |\bnfts{}| & terminal string & $\bnfts{terminal}$ \\ % |\bnftd{}| & terminal description & $\bnftd{description}$ \\[1ex] % |\bnfpn{}| & production name & $\bnfpn{name}$ \\ % |\bnfpo| & production operator & $\bnfpo$ \bigstrut[b] \\ % \hline % \end{tabular} % \end{center} % % \section{Example}\label{example} % % A more significant example is the following definition of a $\bnfpn{sentence}$, % where $\bnfpn{cchar}$ are countable characters, and $\bnfpn{ichar}$ are characters % that should be ignored: % % \begin{samepage} % \small %\begin{verbatim} %\begin{bnf*} % \bnfprod{sentence} % {\bnfpn{start} \bnfsp \bnfpn{rest} \bnfsp \bnfts{.}}\\ % \bnfprod{start} % {\bnfpn{space} \bnfor \bnfes}\\ % \bnfprod{rest} % {\bnfpn{word} \bnfsp \bnfpn{space} \bnfsp \bnfpn{rest} % \bnfor \bnfpn{word} \bnfor \bnfes}\\ % \bnfprod{word} % {\bnfpn{wchar} \bnfsp \bnfpn{word} \bnfor \bnfpn{wchar}}\\ % \bnfprod{space} % {\bnfpn{schar} \bnfsp \bnfpn{space} \bnfor \bnfpn{schar}}\\ % \bnfprod{wchar} % {\bnfpn{cchar} \bnfor \bnfpn{ichar} }\\ % \bnfprod{cchar} % {\bnfts{A} \bnfsk \bnfts{Z} \bnfor \bnfts{a} \bnfsk % \bnfts{z} \bnfor \bnfts{0} \bnfsk \bnfts{9} \bnfor % \bnfts{\textquotesingle}}\\ % \bnfprod{ichar} % {\bnfts{-}} % \bnfprod{schar} % {\bnfts{`\hspace{1em}'} \bnfor \bnfts{!} \bnfor \bnfts{"} % \bnfor \bnfts{(} \bnfor \bnfts{)} \bnfor \bnfts{\{} % \bnfor \bnfts{\}} \bnfor }\\ % \bnfmore{\bnfts{:} \bnfor \bnfts{;} \bnfor \bnfts{?} \bnfor % \bnfts{,} } %\end{bnf*} %\end{verbatim} % \end{samepage} % % \noindent % This creates the following BNF definition: %\begin{bnf} % \bnfprod{sentence} % {\bnfpn{start} \bnfsp \bnfpn{rest} \bnfsp \bnfts{.}}\\ % \bnfprod{start} % {\bnfpn{space} \bnfor \bnfes}\\ % \bnfprod{rest} % {\bnfpn{word} \bnfsp \bnfpn{space} \bnfsp \bnfpn{rest} % \bnfor \bnfpn{word} \bnfor \bnfes }\\ % \bnfprod{word} % {\bnfpn{wchar} \bnfsp \bnfpn{word} \bnfor \bnfpn{wchar}}\\ % \bnfprod{space} % {\bnfpn{schar} \bnfsp \bnfpn{space} \bnfor \bnfpn{schar}}\\ % \bnfprod{wchar} % {\bnfpn{cchar} \bnfor \bnfpn{ichar} }\\ % \bnfprod{cchar} % {\bnfts{A} \bnfsk \bnfts{Z} \bnfor \bnfts{a} \bnfsk % \bnfts{z} \bnfor \bnfts{0} \bnfsk \bnfts{9} \bnfor % \bnfts{\textquotesingle} }\\ % \bnfprod{ichar} % {\bnfts{-}}\\ % \bnfprod*{schar} % {\textrm{`\hspace{1em}'} \bnfor \bnfts{!} \bnfor \bnfts{"} % \bnfor \bnfts{(} \bnfor \bnfts{)} \bnfor \bnfts{\{} % \bnfor \bnfts{\}} \bnfor }\\ % \bnfmore{\bnfts{:} \bnfor \bnfts{;} \bnfor \bnfts{?} \bnfor % \bnfts{,} } %\end{bnf} % % \noindent %^^A Notice the kludge in production 9: \verb|\textrm{`\hspace{1em}'}|. % Notice the kludge in production 9. % We use \verb|\textrm{`\hspace{1em}'}| to typeset a representation for a space % character. % This is needed because we do not want to print in typewriter font, % which would imply the quotes were part of an actual terminal string. % The \verb|\textrm| is needed because are in maths mode. % %^^AT \appendix % \section{Terminal string characters} % % The characters used with \verb|\bnfts{}| (terminal string) are just standard % LaTeX that is typeset in either a roman or typewriter font. % This means we might have to use some escape pairs and a few special characters. % Apostrophes and speech marks can be confusing. There are some of the possibilities: % % \begin{tabbing} % xxxxxxxx \= xxxxxxxxxxxxxxxxxxxxxxxxxx \= xxxxxxxxxxxxxxxxx\= \kill % alpha \> \verb|\bnfts{abcdABCD}| \> $\texttt{abcdABCD}$ \> $\textrm{abcdABCD}$\\ % numeric \> \verb|\bnfts{01234}| \> $\texttt{01234}$ \> $\textrm{01234}$\\ % % simple \> \verb|\bnfts{<>[]()*+-=}| \> $\texttt{<>[]()*+-=}$ \> $\textrm{<>[]()*+-=}$\\ % simple \> \verb|\bnfts{@!?/,.;:}| \> $\texttt{@!?/,.;:}$ \> $\textrm{@!?/,.;:}$\\ % % escaped \> \verb|\bnfts{\{\}\$\%\&\_\#}| \> $\texttt{\{\}\$\%\&\_\#}$ % \> $\textrm{\{\}\$\%\&\_\#}$\\ % % quotes \> \verb|\bnfts{' ` " `` ''}| \> $\texttt{' ` " `` ''}$ % \> $\textrm{' ` " `` ''}$\\ % quotes \> \verb|\bnfts{\textquotesingle}| \> $\texttt{\textquotesingle}$ % \> $\textrm{\textquotesingle}$\\ % % pound \> \verb|\bnfts{\pounds}| \> $\texttt{\pounds}$ \> $\textrm{\pounds}$\\ % hat \> \verb|\bnfts{\textasciicircum}| \> $\texttt{\textasciicircum}$ % \> $\textrm{\textasciicircum}$\\ % backslash \> \verb|\bnfts{\textbackslash}| \> $\texttt{\textbackslash}$ % \> $\textrm{\textbackslash}$\\ % tilde \> \verb|\bnfts{\textasciitilde}| \> $\texttt{\textasciitilde}$ \> % $\textrm{\textasciitilde}$ % \end{tabbing} % % % \noindent % The \verb|\textquotesingle| symbol needs the {\tt textcomp} package, which provides % lots of other interesting symbols. Consult the excellent \emph{The Comprehensive LATEX Symbol List} by Scott Pakin for more information. % %^^A------------------------------------------------------------------- %^^A Start code implementation %^^A------------------------------------------------------------------- % %^^A \StopEventually{} % \StopEventually{\PrintChanges} %^^A -> Run pdfLaTeX backnaur.dtx %^^A makeindex -s gglo.ist -o backnaur.gls backnaur.glo %^^A pdfLaTeX backnaur.dtx %^^A \StopEventually{\PrintIndex} %^^A -> Run pdfLaTeX backnaur.dtx %^^A makeindex -s gind.ist -o backnaur.ind backnaur.idx %^^A pdfLaTeX backnaur.dtx % % \newpage % \section{Implementation} % % The implementation of |backnaur.sty| uses only \LaTeX{} commands. % % \subsection{Environments}\label{environ} % % There are two environments defined: % % \begin{environment}{bnf} % A production list with numbers. It is simply implemented as an |eqnarray|. % Surplus space is removed with an |\ignorespacesafterend| and |%| characters. % \begin{macrocode} \newenvironment{bnf}% {\begin{eqnarray}}% {\end{eqnarray}\ignorespacesafterend} % \end{macrocode} % \end{environment} % % \begin{environment}{bnf*} % A lists without numbers. It is implemented with an |eqnarray*|, % and extra space is removed as in the |bnf| environment above. % \begin{macrocode} \newenvironment{bnf*}% {\begin{eqnarray*}}% {\end{eqnarray*}\ignorespacesafterend} % \end{macrocode} % \end{environment} % % \subsection{Definition Commands} % % All of these commands run in the math mode supplied by the % |bnf| and |bnf*| environments (see \S\ref{environ}). % % \begin{macro}{\bnfpn} % Production name / nonterminal. % \changes{v3.1}{2019/06/18}{Fix font handling} % \begin{macrocode} \newcommand{\bnfpn}[1]{\langle \textrm{#1} \rangle} % \end{macrocode} % \end{macro} % % \begin{macro}{\bnfor} % OR operator. % \begin{macrocode} \newcommand{\bnfor}{\; \mid \;} % \end{macrocode} % \end{macro} % % \begin{macro}{\bnfsp} % Space or AND operator. % \begin{macrocode} \newcommand{\bnfsp}{\;} % \end{macrocode} % \end{macro} % % \begin{macro}{\bnfes} % Empty string symbol. This is the default if no package options are given. % \begin{macrocode} \newcommand{\bnfes}{\lambda} % \end{macrocode} % \end{macro} % % \begin{macro}{\bnfts}\label{codebnfts} % \changes{v1.1}{2012/12/12}{Support for {\tt tstt} option added} % \changes{v3.1}{2019/06/18}{Fix font handling} % \begin{macro}{\bnf@tsfont} % Terminal string. The font is controlled by the |\bnf@tsfont| macro, % and this macro can be redefined by the |tsrm| option (see \S\ref{codeoptions}). % The default is typewriter font. % \begin{macrocode} \newcommand{\bnf@tsfont}[1]{\texttt{#1}} \newcommand{\bnfts}[1]{\bnf@tsfont{#1}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\bnfpo} % Terminal description. % \changes{v3.1}{2019/06/18}{Fix font handling} % \begin{macrocode} \newcommand{\bnftd}[1]{\textit{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\bnfsk} % Skip symbol. % \begin{macrocode} \newcommand{\bnfsk}{\dots} % \end{macrocode} % \end{macro} % % \begin{macro}{\bnfpo} % Production operator. % \begin{macrocode} \newcommand{\bnfpo}{\models} % \end{macrocode} % \end{macro} % % \subsection{Production Commands} % %^^A \newcommand{\bnfprod}{\@ifstar{\bnf@prodnn}{\bnf@prodyn}} %^^A \newcommand{\bnf@prodyn}[2]{\bnfpn{#1} & \bnfpo & #2} %^^A \newcommand{\bnf@prodnn}[2]{\nonumber \bnfpn{#1} & \bnfpo & #2} %^^A \newcommand{\bnfmore}{\@ifstar{\bnf@morenn}{\bnf@moreyn}} %^^A \newcommand{\bnf@moreyn}[1]{ & & #1} %^^A \newcommand{\bnf@morenn}[1]{\nonumber & & #1} % % \begin{macro}{\bnfprod} % \begin{macro}{\bnfprod*} % \changes{v3.0}{2019/06/07}{Added {\tt *} version of the macro.} % \begin{macro}{\bnf@prodyn} % \begin{macro}{\bnf@prodnn} % A Backus-Naur Form production. % This command is designed to exploit the behaviour the |equarray| used in % the |bnf| and |bnf*| environments. % In particular, the |\bnfpo| character will be vertically aligned. % The {\tt *} version suppresses the line number% \begin{macrocode} \newcommand{\bnfprod}{\@ifstar{\bnf@prodnn}{\bnf@prodyn}} \newcommand{\bnf@prodyn}[2]{\bnfpn{#1} & \bnfpo & #2} \newcommand{\bnf@prodnn}[2]{\nonumber \bnfpn{#1} & \bnfpo & #2} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\bnfmore} % \changes{v2.0}{2019/04/07}{Added macro.} % \begin{macro}{\bnfmore*} % \changes{v3.0}{2019/06/07}{Added {\tt *} version of the macro.} % \begin{macro}{\bnf@moreyn} % \begin{macro}{\bnf@morenn} % A continuation of a Backus-Naur Form production. % This command is designed to exploit the behaviour the |equarray| used in % the |bnf| and |bnf*| environments to correctly align with preceding % |\bnfprod| and |\bnfmore| macros. % The {\tt *} version suppresses the line number. % \begin{macrocode} \newcommand{\bnfmore}{\@ifstar{\bnf@morenn}{\bnf@moreyn}} \newcommand{\bnf@moreyn}[1]{ & & #1} \newcommand{\bnf@morenn}[1]{\nonumber & & #1} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \subsection{Options}\label{codeoptions} % %\begin{macro}{tstt} % \changes{v1.1}{2012/12/12}{New option} % \changes{v2.0}{2019/04/14}{Changed to be default} % \changes{v3.0}{2019/06/07}{Option removed but still default} % The |tstt| option is depreciated and can no longer be used. % Nevertheless, typewriter font for terminal stings, which it selected, % is still the package's default. %\end{macro} % % \begin{macro}{tsrm} % \changes{v2.0}{2019/04/14}{New option} % \begin{macro}{\bnf@tsfont} % The |tsrm| option redefines |\bnf@tsfont| to change the % terminal string font used in the |\bnfts| command (see \S\ref{codebnfts}) to roman font. % \begin{macrocode} \DeclareOption{tsrm}{\renewcommand{\bnf@tsfont}[1]{\textrm{#1}}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{perp} % \begin{macro}{epsilon} % \begin{macro}{\bnfes} % The |perp| and |epsilon| options redefine |\bnfes|, % which is the empty string command: % \begin{macrocode} \DeclareOption{perp}{\renewcommand{\bnfes}{\perp}} \DeclareOption{epsilon}{\renewcommand{\bnfes}{\epsilon}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{altpo} % \changes{v3.0}{2019/06/07}{New option} % \begin{macro}{\bnfpo} % The |altpo| option redefines |\bnfpo| % which prints the production operator: % \begin{macrocode} \DeclareOption{altpo}{\renewcommand{\bnfpo}{::=}} % \end{macrocode} % \end{macro} % \end{macro} %\noindent % Finally, the options that have been selected are executed: % \begin{macrocode} \ProcessOptions\relax % \end{macrocode} % % \Finale \endinput