From d79a721c345c9a2ced6c0640e88c10cc3378c1f0 Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Wed, 1 Jul 2020 03:03:30 +0000
Subject: CTAN sync 202007010303

---
 macros/luatex/generic/cloze/cloze.dtx | 907 ++++++++++++++++++++++++++++++++++
 1 file changed, 907 insertions(+)
 create mode 100644 macros/luatex/generic/cloze/cloze.dtx

(limited to 'macros/luatex/generic/cloze/cloze.dtx')

diff --git a/macros/luatex/generic/cloze/cloze.dtx b/macros/luatex/generic/cloze/cloze.dtx
new file mode 100644
index 0000000000..1c18af683b
--- /dev/null
+++ b/macros/luatex/generic/cloze/cloze.dtx
@@ -0,0 +1,907 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2015-2020 by Josef Friedrich <josef@friedrich.rocks>
+% ----------------------------------------------------------------------
+% 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 Josef Friedrich.
+%
+% This work consists of the files cloze.dtx and cloze.ins
+% and the derived filebase cloze.sty and cloze.lua.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{cloze.dtx}
+%</driver>
+%<latex>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<latex>\ProvidesPackage{cloze}
+%<*latex>
+    [2020/06/60 v1.6 Package to typeset cloze worksheets or cloze tests]
+%</latex>
+% \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}{2015/06/16}{Converted to DTX file}
+%
+% \changes{v1.0}{2015/07/08}{Inital release}
+%
+% \changes{v1.1}{2016/06/13}{Make cloze compatible to LuaTeX version
+% 0.95}
+%
+% \changes{v1.2}{2016/06/23}{The cloze makros are now working in
+% tabular, tabbing and picture environments}
+%
+% \changes{v1.3}{2017/03/13}{Add the new macros \cmd{\clozenol} and
+% \cmd{\clozeextend} and the environments \texttt{clozebox} and
+% \texttt{clozespace} (This version was not published on CTAN.)}
+%
+% \changes{v1.4}{2020/05/20}{Add the new macro \cmd{\clozestrike} and
+% improve the documentation}
+%
+% \changes{v1.5}{2020/05/27}{
+% * The Lua part of the package (cloze.lua) is now being developed in a
+% separate file.
+% * The readme file is now a standalone mardown file and not embedded in
+% the dtx file any more.
+% * \href{https://github.com/stevedonovan/LDoc}{LDoc} is being used
+% to generate
+% \href{https://josef-friedrich.github.io/cloze}{source code documentation}.
+% * This version fixes two bugs (cloze in display math, line color and
+% hide).
+% }
+%
+% \changes{v1.6}{2020/06/30}{
+% * Implement basic plain \TeX{} respectively plain Lua\TeX{} interface.
+% * Fix issue: Duplicate line generation on the second line in cloze.
+% * Fix issue: width of first line wrong in itemize, mdframed.
+% * Fix issue \#4: \texttt{\string\clozenol} not transparent.
+% * Fix issue: \texttt{clozebox} not transparent.
+% }
+%
+% \DoNotIndex{\newcommand,\newenvironment,\def,\directlua}
+%
+% \StopEventually{}
+% \pagebreak
+% \section{Implementation}
+%
+% \iffalse
+%<*plaintex>
+% \fi
+% \MacroTopsep = 10pt plus 2pt minus 2pt
+% \MacrocodeTopsep = 10pt plus 1.2pt minus 1pt
+%
+% \makeatletter
+% \c@CodelineNo 25 \relax
+% \makeatother
+%
+% \subsection{The file \tt{cloze.tex}}
+%
+% The cloze package uses following naming conventions: Internal / private
+% macros / commands / envirnoments are written in PascalCase, public
+% ones are written in lowercase. Earlier versions of this package used
+% @ characters for private macros. The lower level / private macros
+% are now defined in the plain Lua\TeX{} version of the package and
+% used to set cloze text in plain Lua\TeX{}.
+%
+%    \begin{macrocode}
+\directlua{
+  cloze = require('cloze')
+}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\newif\ifclozeshow\clozeshowtrue
+%    \end{macrocode}
+%
+% \subsubsection{Internal macros}
+%
+% \begin{macro}{\ClozeSetToGlobal}
+% Set the Lua variable |registry.is_global| to |true|. All options
+% are then stored in the variable |registry.global_options|.
+%    \begin{macrocode}
+\def\ClozeSetToGlobal{%
+  \directlua{cloze.set_is_global(true)}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ClozeSetToLocal}
+% First unset the variable |registry.local_options|. Now set the Lua
+% variable |registry.is_global| to |false|. All options are then stored
+% in the variable |registry.local_options|.
+%    \begin{macrocode}
+\def\ClozeSetToLocal{%
+  \directlua{
+    cloze.unset_local_options()
+    cloze.set_is_global(false)
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ClozeGetOption}
+% This macro is used in the documentation to show the default values
+% of some options.
+%    \begin{macrocode}
+\def\ClozeGetOption#1{%
+  \directlua{
+    tex.print(cloze.get_value('#1'))
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ClozeColor}
+% Convert a color definiton name to a PDF colorstack string, for example
+% convert the color name |blue| to the colorstack string
+% |0 0 1 rg 0 0 1 RG|. The macro definition |\ClozeColor{blue}|
+% builds itself the macro |\color@blue|, which expands to the PDF
+% colorstack string. The colorstack string is necessary to generate a
+% PDF colorstack whatsit.
+%    \begin{macrocode}
+\def\ClozeColor#1{\csname\string\color@#1\endcsname}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ClozeStartMarker}
+% At the begining |\ClozeStartMarker| registers the required Lua
+% callbacks. Then it inserts a whatsit marker which marks the begin of a
+% gap.
+%    \begin{macrocode}
+\def\ClozeStartMarker#1{%
+  \strut\directlua{
+    cloze.register('#1')
+    cloze.marker('#1', 'start')
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ClozeStopMarker}
+% \cmd{\ClozeStopMarker} inserts a whatsit marker that marks the end
+% of gap.
+%    \begin{macrocode}
+\def\ClozeStopMarker#1{%
+  \strut\directlua{
+    cloze.marker('#1', 'stop')
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ClozeMargin}
+% \cmd{\ClozeMargin} surrounds a text in a gap with two |kerns|.
+%    \begin{macrocode}
+\def\ClozeMargin#1{%
+  \directlua{cloze.margin()}%
+  #1%
+  \directlua{cloze.margin()}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Public plain \TeX{} macros}
+%
+% \begin{macro}{\clozesetoption}
+% \cmd{\clozesetoption} is a wrapper for the Lua function
+% |registry.set_option|. \cmd{\clozesetoption}\marg{key}\marg{value}
+% sets a key \meta{key} to the value \meta{value}.
+%    \begin{macrocode}
+\def\clozesetoption#1#2{%
+  \ClozeSetToGlobal%
+  \directlua{cloze.set_option('#1', '#2')}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozereset}
+% The usage of the command \cmd{\clozereset} is described in detail in
+% section \TmpSecRef{sec:command-clozereset}.
+%    \begin{macrocode}
+\def\clozereset{%
+  \ClozeSetToGlobal%
+  \directlua{cloze.reset()}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozeshow}
+% The usage of the command \cmd{\clozeshow} is described in detail in
+% section \TmpSecRef{sec:command-clozeshow}.
+%    \begin{macrocode}
+\def\clozeshow{%
+  \clozeshowtrue%
+  \ClozeSetToGlobal%
+  \clozesetoption{show}{true}%
+  \clozesetoption{hide}{false}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozehide}
+% The usage of the command \cmd{\clozehide} is described in detail in
+% section \TmpSecRef{sec:command-clozehide}.
+%    \begin{macrocode}
+\def\clozehide{%
+  \clozeshowfalse%
+  \ClozeSetToGlobal%
+  \clozesetoption{hide}{true}%
+  \clozesetoption{show}{false}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\clozefont}
+% The usage of the command \cmd{\clozefont} is described in detail in
+% section \TmpSecRef{sec:command-clozefont}.
+%    \begin{macrocode}
+\def\clozefont{\it}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozesetfont}
+% The usage of the command \cmd{\clozesetfont} is described in detail in
+% section \TmpSecRef{sec:command-clozesetfont}.
+%    \begin{macrocode}
+\def\clozesetfont#1{%
+  \def\clozefont{%
+    #1%
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cloze}
+% This is the plain Lua\TeX-Version of the macro \cmd{\cloze}.
+%    \begin{macrocode}
+\def\cloze#1{%
+  \ClozeStartMarker{basic}%
+  {%
+    \clozefont\relax%
+    \ClozeMargin{#1}%
+  }%
+  \ClozeStopMarker{basic}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozefix}
+% This is the plain Lua\TeX-Version of \cmd{\clozefix}. The usage of the
+% command \cmd{\clozefix} is described in detail in
+% section \TmpSecRef{sec:command-clozefix}.
+%    \begin{macrocode}
+\def\clozefix#1{%
+  \ClozeStartMarker{fix}%
+  {%
+    \clozefont\relax%
+    \ClozeMargin{#1}%
+  }%
+  \ClozeStopMarker{fix}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozenol}
+% This is the plain Lua\TeX-Version of the macro \cmd{\clozenol}. The
+% usage of the command \cmd{\clozenol} is described in detail in
+% section \TmpSecRef{sec:command-clozenol}.
+%    \begin{macrocode}
+\def\clozenol#1{%
+  \clozesetoption{thickness}{0pt}%
+  \ClozeStartMarker{basic}%
+  {%
+    \clozefont\relax%
+    \ClozeMargin{#1}%
+  }%
+  \ClozeStopMarker{basic}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozeline}
+% This is the plain Lua\TeX-Version of the macro \cmd{\clozeline}. The
+% usage of the command \cmd{\clozeline} is described in detail in
+% section \TmpSecRef{sec:command-clozeline}.
+%    \begin{macrocode}
+\def\clozeline{%
+  \directlua{cloze.line()}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozelinefil}
+% This is the plain Lua\TeX-Version of the macro \cmd{\clozelinefil}.
+% The usage of the command \cmd{\clozelinefil} is described in detail in
+% section \TmpSecRef{sec:command-clozelinefil}.
+%    \begin{macrocode}
+\def\clozelinefil{%
+  \strut%
+  \directlua{cloze.linefil()}%
+  \strut%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozefil}
+% This is the plain Lua\TeX-Version of the macro \cmd{\clozefil}.
+% The usage of the command \cmd{\clozefil} is described in detail in
+% section \TmpSecRef{sec:command-clozefil}.
+%    \begin{macrocode}
+\def\clozefil#1{%
+  \cloze{#1}\clozelinefil%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozeparcmd}
+% The usage of the macro \cmd{\clozeparcmd} is described in detail in
+% section \TmpSecRef{sec:command-clozeparcmd}.
+%    \begin{macrocode}
+\def\clozeparcmd#1\par {%
+  \par%
+  \ClozeStartMarker{par}%
+  \clozefont\relax%
+  #1%
+  \ClozeStopMarker{par}%
+  \par%
+  \directlua{cloze.unregister('par')}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \iffalse
+%</plaintex>
+% \fi
+%
+% \iffalse
+%<*latex>
+% \fi
+% \MacroTopsep = 10pt plus 2pt minus 2pt
+% \MacrocodeTopsep = 10pt plus 1.2pt minus 1pt
+%
+% \makeatletter
+% \c@CodelineNo 25 \relax
+% \makeatother
+%
+% \subsection{The file \tt{cloze.sty}}
+%
+%    \begin{macrocode}
+\input{cloze.tex}
+%    \end{macrocode}
+%
+% This packages are used to build \emph{cloze}:
+%
+% \subsubsection{Dependencies}
+%
+% The package \href{https://www.ctan.org/pkg/fontspec}{fontspec} is not
+% necessarily required. When using Lua\LaTeX{} it is good form to load
+% it. Apart from this the package supplies helpful messages, when you
+% compile a Lua\LaTeX{} document with pdf\LaTeX{}.
+%    \begin{macrocode}
+\RequirePackage{fontspec}
+%    \end{macrocode}
+% The package \href{https://www.ctan.org/pkg/luatexbase}{luatexbase}
+% allows to register multiple Lua callbacks.
+%    \begin{macrocode}
+\RequirePackage{luatexbase-mcb}
+%    \end{macrocode}
+% The package \href{https://www.ctan.org/pkg/kvoptions}{kvoptions}
+% takes the handling of the options.
+%    \begin{macrocode}
+\RequirePackage{kvoptions}
+%    \end{macrocode}
+% The package \href{https://www.ctan.org/pkg/setspace}{setspace} is used
+% by the environment |clozespace|.
+%    \begin{macrocode}
+\RequirePackage{setspace}
+%    \end{macrocode}
+% The package \href{https://www.ctan.org/pkg/xcolor}{xcolor} is required
+% to colorize the text and the line of a gap.
+%    \begin{macrocode}
+\RequirePackage{xcolor}
+%    \end{macrocode}
+% The package \href{https://www.ctan.org/pkg/xcolor}{xparse} is used by
+% the environment |clozebox|.
+%    \begin{macrocode}
+\RequirePackage{xparse}
+%    \end{macrocode}
+% The package \href{https://www.ctan.org/pkg/stackengine}{stackengine}
+% is required by the command |\clozestrike{}{}|.
+%    \begin{macrocode}
+\RequirePackage{stackengine}
+%    \end{macrocode}
+% The package \href{https://www.ctan.org/pkg/ulem}{ulem} is required by
+% the command |\clozestrike{}{}|.
+%    \begin{macrocode}
+\RequirePackage{ulem}
+\normalem
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\RequirePackage{transparent}
+%    \end{macrocode}
+%
+% Load the cloze lua module and put all return values in the variable
+% |cloze|.
+%
+% \begin{macro}{\clozesetoption}
+% \cmd{\clozesetoption} is a wrapper for the Lua function
+% |registry.set_option|. \cmd{\clozesetoption}\marg{key}\marg{value}
+% sets a key \meta{key} to the value \meta{value}. The plain Lua\TeX{}
+% version always sets to the global options. The Lua\LaTeX-version
+% can set values both to the local and the global options store.
+%    \begin{macrocode}
+\let\clozesetoption=\undefined
+\newcommand{\clozesetoption}[2]{%
+  \directlua{cloze.set_option('#1', '#2')}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ClozeSetLocalOptions}
+% This macro is used in all cloze commands to handle the optional
+% arguments. First it sets the option storage to local and then it
+% commits the options to the package \emph{kvoptions} via the macro
+% |\kvsetkeys{CLZ}{}|.
+%    \begin{macrocode}
+\def\ClozeSetLocalOptions#1{%
+  \ClozeSetToLocal%
+  \kvsetkeys{CLZ}{#1}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Options}
+%
+% \emph{cloze} offers key-value pairs to use as options. For processing
+% the key-value pairs we use the package
+% \href{https://www.ctan.org/pkg/kvoptions}{kvoptions}.
+% To make all key-value pairs accessibly to Lua code, we use the
+% declaration
+% \cmd{\define@key}\marg{CLZ}\marg{option}\oarg[]\marg{\dots}. This
+% declaration comes from the package
+% \href{https://www.ctan.org/pkg/keyval}{keyval}.
+%
+% At start all values are declared as global options. At the Lua side
+% all values are now stored in the |registry.global_options| table.
+%
+%    \begin{macrocode}
+\ClozeSetToGlobal
+%    \end{macrocode}
+%
+% We use the abbreviation |CLZ| for \emph{cloze} as family name and
+% prefix.
+%
+%    \begin{macrocode}
+\SetupKeyvalOptions{
+  family=CLZ,
+  prefix=CLZ@
+}
+%    \end{macrocode}
+%
+% \paragraph{\tt{align}}
+%
+% \noindent Please read the section \TmpSecRef{sec:option-align} how to use
+% the option |align|. |align| affects only the command \cmd{\clozefix}
+% \TmpSecRef{sec:command-clozefix}.
+%
+%    \begin{macrocode}
+\DeclareStringOption{align}
+\define@key{CLZ}{align}[]{\clozesetoption{align}{#1}}
+%    \end{macrocode}
+%
+% \paragraph{\tt{boxheight}}
+%
+% \noindent Please read the section \TmpSecRef{sec:command-clozebox}
+% how to use the option |boxheight|. |boxheight| affects only the
+% environment |clozebox|.
+% \TmpSecRef{sec:command-clozefix}.
+%
+%    \begin{macrocode}
+\DeclareStringOption{boxheight}
+\define@key{CLZ}{boxheight}[]{\clozesetoption{boxheight}{#1}}
+%    \end{macrocode}
+%
+% \paragraph{\tt{boxwidth}}
+%
+% \noindent Please read the section \TmpSecRef{sec:command-clozebox}
+% how to use the option |boxwidth|. |boxwidth| affects only the
+% environment |clozebox|.
+% \TmpSecRef{sec:command-clozefix}.
+%
+%    \begin{macrocode}
+\DeclareStringOption{boxwidth}
+\define@key{CLZ}{boxwidth}[]{\clozesetoption{boxwidth}{#1}}
+%    \end{macrocode}
+%
+% \paragraph{\tt{distance}}
+%
+% \noindent Please read the section \TmpSecRef{sec:option-distance} how to
+% use the option |distance|.
+%
+%    \begin{macrocode}
+\DeclareStringOption{distance}
+\define@key{CLZ}{distance}[]{\clozesetoption{distance}{#1}}
+%    \end{macrocode}
+%
+% \paragraph{\tt{hide}}
+%
+% \noindent If the option |hide| appears in the commands, |hide| will be
+% set to \emph{true} and |show| to \emph{false} on the Lua side. Please
+% read the section \TmpSecRef{sec:option-hide} how to use the option
+% |hide|.
+%
+%    \begin{macrocode}
+\DeclareVoidOption{hide}{%
+  \clozeshowfalse%
+  \clozesetoption{hide}{true}%
+  \clozesetoption{show}{false}%
+}
+%    \end{macrocode}
+%
+% \paragraph{\tt{linecolor}}
+%
+% \noindent Please read the section \TmpSecRef{sec:option-linecolor} how to
+% use the option |linecolor|.
+%
+%    \begin{macrocode}
+\DeclareStringOption{linecolor}
+\define@key{CLZ}{linecolor}[]{%
+  \clozesetoption{linecolor}{\ClozeColor{#1}}%
+  \clozesetoption{linecolor_name}{#1}%
+}
+%    \end{macrocode}
+%
+% \paragraph{\tt{margin}}
+%
+% \noindent Please read the section \TmpSecRef{sec:option-margin} how to
+% use the option |margin|.
+%
+%    \begin{macrocode}
+\DeclareStringOption{margin}
+\define@key{CLZ}{margin}[]{\clozesetoption{margin}{#1}}
+%    \end{macrocode}
+%
+% \paragraph{\tt{show}}
+%
+% \noindent If the option |show| appears in the commands, |show| will be
+% set to \emph{true} and |true| to \emph{false} on the Lua side. Please
+% read the section \TmpSecRef{sec:option-show} how to use the option
+% |show|.
+%
+%    \begin{macrocode}
+\DeclareVoidOption{show}{%
+  \clozeshowtrue%
+  \clozesetoption{show}{true}%
+  \clozesetoption{hide}{false}%
+}
+%    \end{macrocode}
+%
+% \paragraph{\tt{spacing}}
+%
+% \noindent Please read the section \TmpSecRef{sec:option-spacing} how to
+% use the option |spacing|.
+%
+%    \begin{macrocode}
+\DeclareStringOption{spacing}
+\define@key{CLZ}{spacing}[]{\clozesetoption{spacing}{#1}}
+%    \end{macrocode}
+%
+% \paragraph{\tt{textcolor}}
+%
+% \noindent Please read the section \TmpSecRef{sec:option-textcolor} how to
+% use the option |textcolor|.
+%
+%    \begin{macrocode}
+\DeclareStringOption{textcolor}
+\define@key{CLZ}{textcolor}[]{%
+  \clozesetoption{textcolor}{\ClozeColor{#1}}%
+  \clozesetoption{textcolor_name}{#1}%
+}
+%    \end{macrocode}
+%
+% \paragraph{\tt{thickness}}
+%
+% \noindent Please read the section \TmpSecRef{sec:option-thickness} how to
+% use the option |thickness|.
+%
+%    \begin{macrocode}
+\DeclareStringOption{thickness}
+\define@key{CLZ}{thickness}[]{\clozesetoption{thickness}{#1}}
+%    \end{macrocode}
+%
+% \paragraph{\tt{width}}
+%
+% \noindent Please read the section \TmpSecRef{sec:option-width} how to use
+% the option |width|. |width| affects only the command \cmd{\clozefix}
+% \TmpSecRef{sec:command-clozefix}.
+%
+%    \begin{macrocode}
+\DeclareStringOption{width}
+\define@key{CLZ}{width}[]{\clozesetoption{width}{#1}}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\ProcessKeyvalOptions{CLZ}
+%    \end{macrocode}
+%
+% \subsubsection{Public macros}
+%
+% All public macros are prefixed with |\cloze|.
+%
+% \begin{macro}{\clozeset}
+% The usage of the command \cmd{\clozeset} is described in detail in
+% section \TmpSecRef{sec:command-clozeset}.
+%    \begin{macrocode}
+\newcommand{\clozeset}[1]{%
+  \ClozeSetToGlobal%
+  \kvsetkeys{CLZ}{#1}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozeshow}
+% The usage of the command \cmd{\clozeshow} is described in detail in
+% section \TmpSecRef{sec:command-clozeshow}.
+%    \begin{macrocode}
+\let\clozeshow=\undefined
+\newcommand{\clozeshow}{%
+  \clozeset{show}
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozehide}
+% The usage of the command \cmd{\clozehide} is described in detail in
+% section \TmpSecRef{sec:command-clozehide}.
+%    \begin{macrocode}
+\let\clozehide=\undefined
+\newcommand{\clozehide}{%
+  \clozeset{hide}
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cloze}
+% The usage of the command \cmd{\cloze} is described in detail in
+% section \TmpSecRef{sec:command-cloze}.
+%    \begin{macrocode}
+\let\clozeplain=\cloze
+\let\cloze=\undefined
+\newcommand{\cloze}[2][]{%
+  \ClozeSetLocalOptions{#1}%
+  \clozeplain{#2}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozefix}
+% The usage of the command \cmd{\clozefix} is described in detail in
+% section \TmpSecRef{sec:command-clozefix}.
+%    \begin{macrocode}
+\let\clozefixplain=\clozefix
+\let\clozefix=\undefined
+\newcommand{\clozefix}[2][]{%
+  \ClozeSetLocalOptions{#1}%
+  \clozefixplain{#2}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozenol}
+% The usage of the command \cmd{\clozenol} is described in detail in
+% section \TmpSecRef{sec:command-clozenol}.
+%    \begin{macrocode}
+\let\clozenolplain=\clozenol
+\let\clozenol=\undefined
+\newcommand{\clozenol}[2][]{%
+  \ClozeSetLocalOptions{#1}%
+  \clozenolplain{#2}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{clozepar}
+% The usage of the environment |clozepar| is described in detail in
+% section \TmpSecRef{sec:command-clozepar}.
+%    \begin{macrocode}
+\newenvironment{clozepar}[1][]%
+{%
+  \par%
+  \ClozeSetLocalOptions{#1}%
+  \ClozeStartMarker{par}%
+  \clozefont\relax%
+}%
+{%
+  \ClozeStopMarker{par}%
+  \par%
+  \directlua{cloze.unregister('par')}%
+}
+%    \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{clozebox}
+% The usage of the environment |clozebox| is described in detail in
+% section \TmpSecRef{sec:command-clozebox}.
+% TODO: Realize this macro with lua code, without ugly |\color{white}|
+% command.
+%    \begin{macrocode}
+\newsavebox{\ClozeBox}%
+\NewDocumentEnvironment{clozebox}{ s O{} +b}{%
+  \ClozeSetLocalOptions{#2}%
+  \noindent%
+  \begin{lrbox}{\ClozeBox}%
+  \directlua{
+    local boxheight = cloze.get_value('boxheight')
+    local boxwidth = cloze.get_value('boxwidth')
+    if boxheight then
+      tex.print('\\begin{minipage}[t][' .. boxheight .. '][t]{' .. boxwidth .. '}')
+    else
+      tex.print('\\begin{minipage}[t]{' .. boxwidth .. '}')
+    end
+  }%
+  \setlength{\parindent}{0pt}%
+  \clozenol[margin=0pt]{#3}%
+  \end{minipage}%
+  \end{lrbox}%
+  \IfBooleanTF{#1}%
+    {\usebox{\ClozeBox}}%
+    {\fbox{\usebox{\ClozeBox}}}%
+}{}
+%    \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{clozespace}
+% The usage of the environment |clozespace| is described in detail in
+% section \TmpSecRef{sec:command-clozespace}.
+% TODO: Realization without setspace package.
+%    \begin{macrocode}
+\newenvironment{clozespace}[1][]%
+{%
+  \ClozeSetLocalOptions{#1}%
+  \begin{spacing}{\directlua{tex.print(cloze.get_value('spacing'))}}%
+}{\end{spacing}}
+%    \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\clozeline}
+% The usage of the command \cmd{\clozeline} is described in detail in
+% section \TmpSecRef{sec:command-clozeline}.
+%    \begin{macrocode}
+\let\clozelineplain=\clozeline
+\let\clozeline=\undefined
+\newcommand{\clozeline}[1][]{%
+  \ClozeSetLocalOptions{#1}%
+  \clozelineplain%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozelinefil}
+% The usage of the command \cmd{\clozelinefil} is described in detail in
+% section \TmpSecRef{sec:command-clozelinefil}.
+%    \begin{macrocode}
+\let\clozelinefilplain=\clozelinefil
+\let\clozelinefil=\undefined
+\newcommand{\clozelinefil}[1][]{%
+  \ClozeSetLocalOptions{#1}%
+  \clozelinefilplain%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozefil}
+% The usage of the command \cmd{\clozefil} is described in detail in
+% section \TmpSecRef{sec:command-clozefil}.
+%    \begin{macrocode}
+\let\clozefil=\undefined
+\newcommand{\clozefil}[2][]{%
+  \cloze[#1]{#2}\clozelinefil[#1]%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozeextend}
+% TODO: Use node library to create kern nodes.
+%    \begin{macrocode}
+\newcommand{\clozeextend}[1][1]{%
+  \directlua{
+    local loop = #1
+    for variable = 1, loop do
+      tex.print(' \string\\hspace{1em} \string\\strut')
+    end
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ClozeTextColor}
+%    \begin{macrocode}
+\newcommand{\ClozeTextColor}[1]{%
+  \textcolor%
+    {\directlua{tex.print(cloze.get_value('textcolor_name'))}}%
+    {#1}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ClozeStrikeLine}
+%    \begin{macrocode}
+\newcommand\ClozeStrikeLine{%
+  \bgroup%
+  \markoverwith{%
+    \ClozeTextColor{%
+      \rule[0.5ex]{2pt}{1pt}%
+    }%
+  }%
+  \ULon%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\clozestrike}
+%    \begin{macrocode}
+\newcommand{\clozestrike}[3][]{%
+  \ClozeSetLocalOptions{#1}%
+  \ifclozeshow%
+    \stackengine%
+      {\Sstackgap}% \Sstackgap or \Lstackgap or \stackgap or stacklength
+      {\ClozeStrikeLine{#2}}% anchor
+      {\ClozeTextColor{\clozefont{}#3}}% item
+      {O}% O or U
+      {c}% \stackalignment or l or c or r
+      {\quietstack}% \quietstack or T or F
+      {T}% \useanchorwidth or T or F
+      {\stacktype}% \stacktype or S or L
+  \else%
+    \stackengine%
+      {\Sstackgap}% \Sstackgap or \Lstackgap or \stackgap or stacklength
+      {#2}% anchor
+      {\texttransparent{0}{\clozefont{}#3}}% item
+      {O}% O or U
+      {c}% \stackalignment or l or c or r
+      {\quietstack}% \quietstack or T or F
+      {T}% \useanchorwidth or T or F
+      {\stacktype}% \stacktype or S or L
+  \fi%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \iffalse
+%</latex>
+% \fi
+%
+% \Finale
+\endinput
-- 
cgit v1.2.3

