%D \module
%D   [       file=m-invull,
%D        version=1995.01.10,
%D          title=\CONTEXT\ Extra Modules,
%D       subtitle=Exercise,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

%I Invuloefeningen kunnen worden vormgegeven met het
%I de commando's:
%I
%I   \definieerinvulwoord[trefwoord]{woord,woord}
%I   \invulwoord[trefwoord]
%I   \invulwoord{woord,woord,...}
%I
%I Daarbij kan het een en ander worden ingesteld met
%I
%I   \stelinvullenin[status=,nummer=,links=,rechts=,letter=]
%P
%I Er zijn drie manieren om woorden in te vullen. De meest
%I eenvoudige is die waarbij de in te vullen woorden in de
%I tekst staan.
%I
%I   bla bla \invulwoord{een,alfa} bla bla bla bla bla bla
%I   bla bla bla bla bla bla bla bla \invulwoord{twee,beta}.
%I
%I De gezette tekst hangt af van de instellingen:
%I
%I   [status=leeg]             ________
%I   [status=vol,nummer=1]     'een' respectievelijk 'twee'
%I   [status=vol,nummer=2]     'alfa' respectievelijk 'beta'
%I
%I Het nummer heeft dus betrekking op het volgnummer in de
%I opgegeven reeks.
%P
%I Bij de tweede manier worden eerste de alternatieven
%I gedefinieerd:
%I
%I   \definieerinvulwoord{een,alfa}
%I   \definieerinvulwoord{twee,beta}
%I
%I die vervolgens worden opgeroepen:
%I
%I   bla \invulwoord[+] bla bla bla bla bla bla bla bla bla
%I   bla bla bla bla bla bla bla bla bla bla \invulwoord[+].
%I
%I De mogelijke instellingen komen overeen met die van de
%I eerste manier.
%P
%I De derde manier is een variant op de tweede. Bij grote
%I teksten kan men het overzicht kwijtraken. Het is daarom
%I mogelijk 'logische' namen toe te kennen aan woorden.
%I
%I   \definieerinvulwoord[a]{een,alfa}
%I   \definieerinvulwoord[b]{twee,beta}
%I
%I die vervolgens worden opgeroepen:
%I
%I   bla \invulwoord[a] bla bla bla bla bla bla bla bla bla
%I   bla bla bla bla bla bla bla bla bla bla \invulwoord[b].
%I
%I Dit maakt het bovendien mogelijk woorden meerdere malen
%I (in een willekeurige volgorde op te roepen:
%I
%I   bla \invulwoord[a] bla \invulwoord[b] bla bla bla bla
%I   bla bla bla bla \invulwoord[b] bla bla \invulwoord[a].
%P
%I Bij [status=leeg] wordt een streep gezet die in breedte
%I overeenkomt met het woord dat er eigenlijk hoort te
%I staan. De ingevulde tekst komt visueel daardoor overeen
%I met de in te vullen tekst, wat vergelijken vereenvoudigd.
%I
%I Met [status=reset] worden enkele tellers weer op 0 gezet.
%I Dit kan nodig zijn als meerdere invuloefeningen in een
%I tekst worden gezet.
%I
%I Als \versie[voorlopig] is ingesteld, worden bij invullers
%I zonder logische namen tussen haakjes de volgnummers
%I getoond.

%S \startsetup
%S   \command
%S     [stelinvullenin]
%S   \type
%S     [\c!vars!]
%S   \variable
%S     [\c!letter]
%S     [\v!normaal,\v!vet,\v!schuin,\v!vetschuin,\v!type,\v!kap,
%S      \v!klein...,\c!command!]
%S     [\v!vet]
%S   \variable
%S     [\c!links]
%S     [\c!text!]
%S     []
%S   \variable
%S     [\c!rechts]
%S     [\c!text!]
%S     []
%S   \variable
%S     [\c!status]
%S     [\v!leeg,\v!vol,\v!reset]
%S     [\v!vol]
%S   \variable
%S     [\c!nummer]
%S     [\c!number!]
%S     [1]
%S   \variable
%S     [\c!lijn]
%S     [\v!aan,\v!uit]
%S     [\v!aan]
%S \stopsetup

%S \startsetup
%S   \command
%S     [invulwoord]
%S   \type
%S     [\c!ref!,\c!opt!\c!val!\c!opt!\c!args!]
%S   \value
%S     [\c!text!]
%S \stopsetup

%S \startsetup
%S   \command
%S     [definieerinvulwoord]
%S   \type
%S     [\c!ref!,\c!opt!\c!val!\c!args!]
%S   \value
%S     [\c!text!]
%S \stopsetup

%  Mogelijke uitbreidingen
%
%  -  [breedte=<maat>,passend,ruim]
%  -  invullijst met nummers
%  -  weergeven lijst tijdens definitie blokkeren
%  -  door elkaar definieren

\unprotect

\definesystemvariable    {iv}

\definereferenceconstant {fillin} {:iv:}

\newcount\invulteller \newcount\invulput \newcount\invulget

\def\stelinvullenin
  {\dosingleargument\dostelinvullenin}

\def\dostelinvullenin[#1]%
  {\getparameters[\??iv][#1]%
   \doif\@@ivstate\v!reset
     {\global\invulput\zerocount
      \global\invulget\zerocount
      \let\@@ivstate\empty}}

\def\definieerinvulwoord
  {\dosingleempty\dodefinieerinvulwoord}

\def\dodefinieerinvulwoord[#1]#2%
  {\iffirstargument
     \setgvalue{\r!fillin#1}{\simpleinvulwoord{#2}}%
   \else
     \global\advance\invulput \plusone
     \setgvalue{\r!fillin\the\invulput}{\simpleinvulwoord{#2}}%
   \fi
   \ifvoorlopig \ifnum\invulput>0
     \setbox\scratchbox=\hbox{~\ttx(\the\invulput)}%
     \wd\scratchbox=\!!zeropoint
     \box\scratchbox \par
   \fi \fi}

\def\dosimpleinvulwoord#1%
  {\ifnum\@@ivnumber>0 \advance\invulteller \plusone \fi
   \ifnum\invulteller=\@@ivnumber\relax
     \bgroup
     \doconvertfont\@@ivstyle
       {\@@ivleft
        \doifelse\@@ivstate\v!empty
          {\doifelse\@@ivrule\v!on\leeginvulwoord\geeninvulwoord}
          {\doifelse\@@ivrule\v!on\underbar      \firstofoneargument}%
        {#1}%
        \@@ivright}%
     \egroup
   \fi}%

\def\simpleinvulwoord#1%
  {\ifnum\@@ivnumber>0
     \invulteller\zerocount
     \processcommalist[#1]\dosimpleinvulwoord
   \else
     \dosimpleinvulwoord{#1}%
   \fi}

\def\complexinvulwoord[#1]%
  {\bgroup
   \doifsomething{#1}
     {\global\advance\invulget \plusone
      \doconvertfont\@@ivstyle
        {\@@ivleft\getvalue{\r!fillin\the\invulget}\@@ivright}}
     {\doconvertfont\@@ivstyle
        {\@@ivleft\getvalue{\r!fillin           #1}\@@ivright}}%
   \egroup}

\definecomplexorsimple\invulwoord

\def\leeginvulwoord#1%
  {{\let\redounderbar\dodounderbar
    \def\dodounderbar##1{\redounderbar{\hphantom{##1}}}%
    \underbar{#1}}}

\def\geeninvulwoord#1%
  {{\def\dodounderbar##1{\hphantom{##1}}%
    \underbar{#1}}}

% when nummer > 0, then commalist processing; beware of $(1,2)$, use { } there

\stelinvullenin
  [\c!number=0,
   \c!style=\v!bold,
   \c!rule=\v!on,
   \c!left=,
   \c!right=,
   \c!state=]

\protect \endinput
