summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/checklistings/checklistings.hva
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/checklistings/checklistings.hva
Initial commit
Diffstat (limited to 'macros/latex/contrib/checklistings/checklistings.hva')
-rw-r--r--macros/latex/contrib/checklistings/checklistings.hva188
1 files changed, 188 insertions, 0 deletions
diff --git a/macros/latex/contrib/checklistings/checklistings.hva b/macros/latex/contrib/checklistings/checklistings.hva
new file mode 100644
index 0000000000..8e3a95563b
--- /dev/null
+++ b/macros/latex/contrib/checklistings/checklistings.hva
@@ -0,0 +1,188 @@
+%% HeVeA support for checklistings.
+%%
+%% Limitations / caveats
+%%
+%% * checklistings.hva requires all the intermediate generated by latex and
+%% checklistings.sh (*.<ext>, *.tex, *.msg, *.err).
+%%
+%% * The options 'codestyle', 'msgstyle', 'errstyle', 'codelst', 'msglst',
+%% and 'errlst' cannot be set as in LaTeX, e.g.,
+%% \checklistings{codelst={language=caml}}
+%% Since HeVeA eliminates the grouping braces and passes 'language' to
+%% the handler for 'codelst' (rather than 'language=caml').
+%%
+%% One workaround is to \usepackage{hevea} and use \ifhevea to select
+%% the most appropriate of the two forms.
+%%
+%% * fancyvrb and the package options codestyle, msgstyle, and errstyle are
+%% not supported.
+%% Alternative 1: use the codelst, msglst, and errlst options.
+%% Alternative 2: use css for formatting code, messages, and errors.
+%%
+%% * Non-empty labels in the arguments of \chklistingmsg and
+%% \chklistingerr are not supported.
+%%
+\ProvidesPackage{checklistings}
+\RequirePackage{keyval}
+\RequirePackage{listings}
+
+\newcounter{chklisting}
+\setcounter{chklisting}{-1}
+
+\newif\ifCHKL@fileexists
+\newif\ifCHKL@showcode\CHKL@showcodetrue
+\newif\ifCHKL@shouldfail\CHKL@shouldfailfalse
+\newif\ifCHKL@withresult\CHKL@withresultfalse
+\newif\ifCHKL@showerrors\CHKL@showerrorstrue
+\newif\ifCHKL@loadhtml\CHKL@loadhtmlfalse
+\def\CHKL@pkg@skipopts{}
+
+% % % Declare Options % % %
+
+\DeclareOption{withresult}{\CHKL@withresulttrue}
+\DeclareOption{withoutresult}{\CHKL@withresultfalse}
+\DeclareOption{skipone}{\def\CHKL@pkg@skipopts{firstline=2}}
+\DeclareOption{skiptwo}{\def\CHKL@pkg@skipopts{firstline=3}}
+\DeclareOption{showproblems}{\CHKL@showproblemstrue}
+\DeclareOption{hideproblems}{\CHKL@showproblemsfalse}
+
+\def\CHKL@codestyle{}
+\def\CHKL@msgstyle{}
+\def\CHKL@errstyle{}
+\define@key{CHKL@pkgkeys}{codestyle}[]{\def\CHKL@codestyle{#1}}
+\define@key{CHKL@pkgkeys}{msgstyle}[]{\def\CHKL@msgstyle{#1}}
+\define@key{CHKL@pkgkeys}{errstyle}[]{\def\CHKL@errstyle{#1}}
+
+\def\CHKL@codelst{}
+\def\CHKL@msglst{}
+\def\CHKL@errlst{}
+\define@key{CHKL@pkgkeys}{codelst}[]{\def\CHKL@codelst{#1}}
+\define@key{CHKL@pkgkeys}{msglst}[]{\def\CHKL@msglst{#1}}
+\define@key{CHKL@pkgkeys}{errlst}[]{\def\CHKL@errlst{#1}}
+
+\def\CHKL@subdir{.}
+\def\CHKL@prefix{chklisting}
+\def\CHKL@prompt{\#}
+\def\CHKL@ext{.ml}
+\define@key{CHKL@pkgkeys}{prompt}[]{\def\CHKL@prompt{#1}}
+\define@key{CHKL@pkgkeys}{subdir}[]{\def\CHKL@subdir{#1}}
+\define@key{CHKL@pkgkeys}{prefix}[]{\def\CHKL@prefix{#1}}
+\define@key{CHKL@pkgkeys}{ext}[]{\def\CHKL@ext{#1}}
+\define@key{CHKL@pkgkeys}{html}[]{\CHKL@loadhtmltrue}
+
+% Unused options
+\define@key{CHKL@pkgkeys}{compiler}[]{}
+\define@key{CHKL@pkgkeys}{compilerflags}[]{}
+\define@key{CHKL@pkgkeys}{lastflags}[]{}
+\define@key{CHKL@pkgkeys}{includecmd}[]{}
+
+% % % Process Options % % %
+
+% Work around the lack of \DeclareOption* in package.hva
+\renewcommand{\@process@option}[1]%
+ {\def\pkg@opt{{\@nostyle\@callprim{\@eatspaces}{#1,}}}%
+ \ifu\csname\@pkg@opt@name{\pkg@opt}\endcsname
+ \setkeys{CHKL@pkgkeys}{#1}
+ \else
+ \csname\@pkg@opt@name{\pkg@opt}\endcsname\fi}%
+
+\ProcessOptions*
+\newcommand{\checklistings}[1]{\ExecuteOptions{#1}}
+
+% % % Macros used in files generated by checklistings.sh % % %
+
+\newif\ifchklisting
+\newcommand{\setchklistingcmd}[1]{%
+ \global\def\chklistingcmd{\emph{\CHKL@prompt{#1}}}}
+
+\newenvironment{ChkListingMsg}{\verblatex}{\endverblatex}
+\newenvironment{ChkListingErr}{\verblatex}{\endverblatex}
+
+\newcommand{\chklistingfile}{\CHKL@prefix\CHKL@ext}
+
+% % % Checklistings user macros % % %
+
+\define@key{CHKL@envkeys}{continue}[]{}
+\define@key{CHKL@envkeys}{include}[]{}
+\define@key{CHKL@envkeys}{label}[]{}
+\define@key{CHKL@envkeys}{showproblems}[]{\CHKL@showproblemstrue}
+\define@key{CHKL@envkeys}{hideproblems}[]{\CHKL@showproblemsfalse}
+\define@key{CHKL@envkeys}{skipnone}[]{\def\CHKL@pkg@skipopts{firstline=1}}
+\define@key{CHKL@envkeys}{skipone}[]{\def\CHKL@pkg@skipopts{firstline=2}}
+\define@key{CHKL@envkeys}{skiptwo}[]{\def\CHKL@pkg@skipopts{firstline=3}}
+\define@key{CHKL@envkeys}{hide}[]{\CHKL@showcodefalse}
+\define@key{CHKL@envkeys}{withresult}[]{\CHKL@withresulttrue}
+\define@key{CHKL@envkeys}{withoutresult}[]{\CHKL@withresultfalse}
+\define@key{CHKL@envkeys}{fail}[]{\CHKL@shouldfailtrue}
+
+% Work around the lack of \edef and \expandafter
+\def\CHKL@lstset#1{\lstset{#1}}
+\def\elstset#1{\@callprim{\CHKL@lstset}{\{#1\}}}
+
+\newcommand{\chklistingmsg}{\bgroup%
+ \setenvclass{lstlisting}{lstlisting chklistingmsg}%
+ \elstset{\CHKL@msgstyle}%
+ \elstset{\CHKL@msglst}%
+ \lstinputlisting{\CHKL@subdir/\CHKL@prefix\CHKL@num.msg}%
+ \egroup}%
+
+\newcommand{\chklistingerr}{\bgroup%
+ \setenvclass{lstlisting}{lstlisting chklistingerr}%
+ \elstset{\CHKL@errstyle}%
+ \elstset{\CHKL@errlst}%
+ \lstinputlisting{\CHKL@subdir/\CHKL@prefix\CHKL@num.err}%
+ \egroup}%
+
+\newenvironment{chklisting}[1][]
+ {%
+ \setenvclass{lstlisting}{lstlisting chklisting}%
+ \stepcounter{chklisting}%
+ \def\@currentlabel{\thechklisting}%
+ \@setkeys{CHKL@envkeys}{#1}%
+ \global\def\CHKL@num{%
+ \ifthenelse{\value{chklisting}<1000}{0}{}%
+ \ifthenelse{\value{chklisting}<100}{0}{}%
+ \ifthenelse{\value{chklisting}<10}{0}{}%
+ \arabic{chklisting}}%
+ \global\def\CHKL@file{\CHKL@subdir/\CHKL@prefix\CHKL@num}%
+ \global\let\chklistingcmd\relax%
+ \ifCHKL@showcode%
+ \bgroup%
+ \ifCHKL@loadhtml%
+ \@open{div}{class="chklisting"}%
+ \rawinput{\CHKL@file{}.html}%
+ \@close{div}%
+ \else%
+ \elstset{\CHKL@pkg@skipopts}%
+ \elstset{\CHKL@codestyle}%
+ \elstset{\CHKL@codelst}%
+ \lstinputlisting{\CHKL@file\CHKL@ext}%
+ \fi%
+ \egroup%
+ \input{\CHKL@file.tex}%
+ \ifCHKL@shouldfail%
+ \ifchklisting%
+ \ifCHKL@showproblems%
+ \begin{divstyle}{checklistingserror}%
+ Unexpected success: \chklistingmsg{}
+ \end{divstyle}%
+ \fi%
+ \else%
+ \ifCHKL@withresult{\chklistingerr{}}\fi%
+ \fi%
+ \else
+ \ifchklisting%
+ \ifCHKL@withresult{\chklistingmsg{}}\fi%
+ \else%
+ \ifCHKL@showproblems%
+ \begin{divstyle}{checklistingserror}%
+ Unexpected failure: \chklistingerr{}
+ \end{divstyle}%
+ \fi%
+ \fi%
+ \fi
+ \fi%
+ \verblatex%
+ }
+ {\endverblatex}%
+\endinput