From 8bb985021b2f40fd3c9ef24653decafda35a3592 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Tue, 30 Jun 2020 21:21:36 +0000 Subject: cloze (30jun20) git-svn-id: svn://tug.org/texlive/trunk@55704 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/lualatex/cloze/README.md | 101 -- Master/texmf-dist/doc/lualatex/cloze/cloze.pdf | Bin 318609 -> 0 bytes Master/texmf-dist/doc/luatex/cloze/README.md | 105 ++ Master/texmf-dist/doc/luatex/cloze/cloze.pdf | Bin 0 -> 600199 bytes Master/texmf-dist/doc/luatex/cloze/cloze.tex | 131 ++ Master/texmf-dist/scripts/cloze/cloze.lua | 679 ++++---- Master/texmf-dist/source/lualatex/cloze/cloze.dtx | 1929 --------------------- Master/texmf-dist/source/lualatex/cloze/cloze.ins | 56 - Master/texmf-dist/source/luatex/cloze/cloze.dtx | 907 ++++++++++ Master/texmf-dist/source/luatex/cloze/cloze.ins | 57 + Master/texmf-dist/tex/lualatex/cloze/cloze.sty | 273 --- Master/texmf-dist/tex/luatex/cloze/cloze.sty | 220 +++ 12 files changed, 1781 insertions(+), 2677 deletions(-) delete mode 100644 Master/texmf-dist/doc/lualatex/cloze/README.md delete mode 100644 Master/texmf-dist/doc/lualatex/cloze/cloze.pdf create mode 100644 Master/texmf-dist/doc/luatex/cloze/README.md create mode 100644 Master/texmf-dist/doc/luatex/cloze/cloze.pdf create mode 100644 Master/texmf-dist/doc/luatex/cloze/cloze.tex delete mode 100644 Master/texmf-dist/source/lualatex/cloze/cloze.dtx delete mode 100644 Master/texmf-dist/source/lualatex/cloze/cloze.ins create mode 100644 Master/texmf-dist/source/luatex/cloze/cloze.dtx create mode 100644 Master/texmf-dist/source/luatex/cloze/cloze.ins delete mode 100644 Master/texmf-dist/tex/lualatex/cloze/cloze.sty create mode 100644 Master/texmf-dist/tex/luatex/cloze/cloze.sty (limited to 'Master') diff --git a/Master/texmf-dist/doc/lualatex/cloze/README.md b/Master/texmf-dist/doc/lualatex/cloze/README.md deleted file mode 100644 index 04dc316ef3d..00000000000 --- a/Master/texmf-dist/doc/lualatex/cloze/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# Description - -EN: `cloze` is a LuaLaTeX/LaTeX package to generate cloze. It uses the -capabilities of the modern TeX engine LuaTex. - -DE: `cloze` ist a LuaLaTeX/LaTeX-Paket zum Erstellen von Lückentexten. -Es nutzt die Möglichkeiten der modernen TeX-Engine LuaTeX. - -# License - -Copyright (C) 2015-2020 by Josef Friedrich ------------------------------------------------------------------------- -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. - -# CTAN - -Since July 2015 the cloze package is included in the Comprehensive TeX -Archive Network (CTAN). - -* TeX archive: http://mirror.ctan.org/tex-archive/macros/luatex/latex/cloze -* Package page: https://www.ctan.org/pkg/cloze - -# Repository - -https://github.com/Josef-Friedrich/cloze - -# Installation - -Get source: - - git clone git@github.com:Josef-Friedrich/cloze.git - cd cloze - -Compile: - - make - -or manually: - - luatex cloze.ins - lualatex --shell-escape cloze.dtx - makeindex -s gglo.ist -o cloze.gls cloze.glo - makeindex -s gind.ist -o cloze.ind cloze.idx - lualatex --shell-escape cloze.dtx - -# Development - -First delete the stable version installed by TeX Live. Because the -package `cloze` belongs to the collection `collection-latexextra`, the -option `--force` must be used to delete the package. - - tlmgr remove --force cloze - -## Deploying a new version - -Update the version number in the file `cloze.dtx` on this locations: - -### In the markup for the file `cloze.sty` (approximately at the line number 30) - - %<*package> - [2020/05/20 v1.4 Package to typeset cloze worksheets or cloze tests] - %<*package> - -### In the markup for the package documentation (approximately at the line number 1250) - -Add a changes entry: - -```latex -\changes{v1.4}{2020/05/20}{...} -``` - -### In the markup for the file `cloze.lua` (approximately at the line number 1900) - -```lua -if not modules then modules = { } end modules ['cloze'] = { - version = '1.4' -} -``` - -### Update the copyright year: - -``` -sed -i 's/(C) 2015-2020/(C) 2015-2021/g' cloze.ins -sed -i 's/(C) 2015-2020/(C) 2015-2021/g' cloze.dtx -``` - -### Command line tasks: - -``` -git tag v1.4 -make -make ctan -``` diff --git a/Master/texmf-dist/doc/lualatex/cloze/cloze.pdf b/Master/texmf-dist/doc/lualatex/cloze/cloze.pdf deleted file mode 100644 index 8f9b26bf235..00000000000 Binary files a/Master/texmf-dist/doc/lualatex/cloze/cloze.pdf and /dev/null differ diff --git a/Master/texmf-dist/doc/luatex/cloze/README.md b/Master/texmf-dist/doc/luatex/cloze/README.md new file mode 100644 index 00000000000..d6919d4c8dc --- /dev/null +++ b/Master/texmf-dist/doc/luatex/cloze/README.md @@ -0,0 +1,105 @@ +# Description + +EN: `cloze` is a LuaLaTeX/LaTeX package to generate cloze. It uses the +capabilities of the modern TeX engine LuaTex. + +DE: `cloze` ist a LuaLaTeX/LaTeX-Paket zum Erstellen von Lückentexten. +Es nutzt die Möglichkeiten der modernen TeX-Engine LuaTeX. + +# License + +Copyright (C) 2015-2020 by Josef Friedrich +------------------------------------------------------------------------ +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. + +# CTAN + +Since July 2015 the cloze package is included in the Comprehensive TeX +Archive Network (CTAN). + +* TeX archive: http://mirror.ctan.org/tex-archive/macros/luatex/latex/cloze +* Package page: https://www.ctan.org/pkg/cloze + +# Repository + +https://github.com/Josef-Friedrich/cloze + +# Installation + +Get source: + + git clone git@github.com:Josef-Friedrich/cloze.git + cd cloze + +Compile: + + make + +or manually: + + luatex cloze.ins + lualatex --shell-escape cloze.dtx + makeindex -s gglo.ist -o cloze.gls cloze.glo + makeindex -s gind.ist -o cloze.ind cloze.idx + lualatex --shell-escape cloze.dtx + +# Development + +First delete the stable version installed by TeX Live. Because the +package `cloze` belongs to the collection `collection-latexextra`, the +option `--force` must be used to delete the package. + + tlmgr remove --force cloze + +## Deploying a new version + +Update the version number in the file `cloze.dtx` on this locations: + +### In the markup for the file `cloze.sty` (approximately at the line number 30) + + %<*package> + [2020/05/20 v1.4 Package to typeset cloze worksheets or cloze tests] + %<*package> + +Add a changes entry (approximately at the line 90): + +```latex +\changes{v1.4}{2020/05/20}{...} +``` + +### In the package documentation `documentation.tex` (approximately at the line number 125) + +```latex +\date{v1.6~from 2020/06/30} +``` + +### In the markup for the file `cloze.lua` (approximately at the line number 1900) + +```lua +if not modules then modules = { } end modules ['cloze'] = { + version = '1.4' +} +``` + +### Update the copyright year: + +``` +sed -i 's/(C) 2015-2020/(C) 2015-2021/g' cloze.ins +sed -i 's/(C) 2015-2020/(C) 2015-2021/g' cloze.dtx +``` + +### Command line tasks: + +``` +git tag v1.4 +make +make ctan +``` diff --git a/Master/texmf-dist/doc/luatex/cloze/cloze.pdf b/Master/texmf-dist/doc/luatex/cloze/cloze.pdf new file mode 100644 index 00000000000..5901e8dd851 Binary files /dev/null and b/Master/texmf-dist/doc/luatex/cloze/cloze.pdf differ diff --git a/Master/texmf-dist/doc/luatex/cloze/cloze.tex b/Master/texmf-dist/doc/luatex/cloze/cloze.tex new file mode 100644 index 00000000000..c3d1f86e124 --- /dev/null +++ b/Master/texmf-dist/doc/luatex/cloze/cloze.tex @@ -0,0 +1,131 @@ +%% +%% This is file `cloze.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% cloze.dtx (with options: `plaintex') +%% +%% This is a generated file. +%% +%% Copyright (C) 2015-2020 by Josef Friedrich +%% ---------------------------------------------------------------------- +%% 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 +%% +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2008/05/05 or later. +%% +\directlua{ + cloze = require('cloze') +} +\newif\ifclozeshow\clozeshowtrue +\def\ClozeSetToGlobal{% + \directlua{cloze.set_is_global(true)}% +} +\def\ClozeSetToLocal{% + \directlua{ + cloze.unset_local_options() + cloze.set_is_global(false) + }% +} +\def\ClozeGetOption#1{% + \directlua{ + tex.print(cloze.get_value('#1')) + }% +} +\def\ClozeColor#1{\csname\string\color@#1\endcsname} +\def\ClozeStartMarker#1{% + \strut\directlua{ + cloze.register('#1') + cloze.marker('#1', 'start') + }% +} +\def\ClozeStopMarker#1{% + \strut\directlua{ + cloze.marker('#1', 'stop') + }% +} +\def\ClozeMargin#1{% + \directlua{cloze.margin()}% + #1% + \directlua{cloze.margin()}% +} +\def\clozesetoption#1#2{% + \ClozeSetToGlobal% + \directlua{cloze.set_option('#1', '#2')}% +} +\def\clozereset{% + \ClozeSetToGlobal% + \directlua{cloze.reset()}% +} +\def\clozeshow{% + \clozeshowtrue% + \ClozeSetToGlobal% + \clozesetoption{show}{true}% + \clozesetoption{hide}{false}% +} +\def\clozehide{% + \clozeshowfalse% + \ClozeSetToGlobal% + \clozesetoption{hide}{true}% + \clozesetoption{show}{false}% +} +\def\clozefont{\it} +\def\clozesetfont#1{% + \def\clozefont{% + #1% + }% +} +\def\cloze#1{% + \ClozeStartMarker{basic}% + {% + \clozefont\relax% + \ClozeMargin{#1}% + }% + \ClozeStopMarker{basic}% +} +\def\clozefix#1{% + \ClozeStartMarker{fix}% + {% + \clozefont\relax% + \ClozeMargin{#1}% + }% + \ClozeStopMarker{fix}% +} +\def\clozenol#1{% + \clozesetoption{thickness}{0pt}% + \ClozeStartMarker{basic}% + {% + \clozefont\relax% + \ClozeMargin{#1}% + }% + \ClozeStopMarker{basic}% +} +\def\clozeline{% + \directlua{cloze.line()}% +} +\def\clozelinefil{% + \strut% + \directlua{cloze.linefil()}% + \strut% +} +\def\clozefil#1{% + \cloze{#1}\clozelinefil% +} +\def\clozeparcmd#1\par {% + \par% + \ClozeStartMarker{par}% + \clozefont\relax% + #1% + \ClozeStopMarker{par}% + \par% + \directlua{cloze.unregister('par')}% +} +\endinput +%% +%% End of file `cloze.tex'. diff --git a/Master/texmf-dist/scripts/cloze/cloze.lua b/Master/texmf-dist/scripts/cloze/cloze.lua index b9490354a5b..1563155a1b7 100755 --- a/Master/texmf-dist/scripts/cloze/cloze.lua +++ b/Master/texmf-dist/scripts/cloze/cloze.lua @@ -7,18 +7,20 @@ -- * _Variable_ names for _nodes_ are suffixed with `_node`, for example -- `head_node`. -- * _Variable_ names for _lengths_ (dimensions) are suffixed with --- `_length`, for example `width_length`. +-- `_length`, for example `width`. -- -- @module cloze --- __cloze.lua}__ +-- luacheck: globals node tex modules luatexbase callback + +-- __cloze.lua__ -- __Initialisation of the function tables__ -- It is good form to provide some background informations about this Lua -- module. if not modules then modules = { } end modules ['cloze'] = { - version = '1.5', + version = '1.6', comment = 'cloze', author = 'Josef Friedrich, R.-M. Huber', copyright = 'Josef Friedrich, R.-M. Huber', @@ -58,13 +60,6 @@ registry.defaults = { registry.global_options = {} registry.local_options = {} --- All those functions are stored in the table `cloze` that are --- registered as callbacks to the pre and post linebreak filters. -local cloze = {} --- In the status table are stored state information, which are necessary --- for the recursive cloze generation. -cloze.status = {} - -- The `base` table contains some basic functions. `base` is the only -- table of this Lua module that will be exported. local base = {} @@ -135,7 +130,7 @@ function nodex.insert_list(position, current, list, head_node) if not head_node then head_node = current end - for i, insert in ipairs(list) do + for _, insert in ipairs(list) do if position == 'after' then head_node, current = node.insert_after(head_node, current, insert) elseif position == 'before' then @@ -154,7 +149,7 @@ end -- -- -- --- +-- -- -- -- @@ -162,13 +157,13 @@ end -- -- -- --- +-- -- -- -- -- -- --- +-- -- -- -- @@ -267,13 +262,13 @@ end -- -- @treturn node hlist_node -- @treturn node strut_node --- @treturn node head_node +-- @treturn node prev_head_node local function insert_strut_into_hlist(hlist_node) - local head_node = hlist_node.head + local prev_head_node = hlist_node.head local kern_node = create_kern_node(0) - local strut_node = node.insert_before(hlist_node.head, head_node, kern_node) - hlist_node.head = head_node.prev - return hlist_node, strut_node, head_node + local strut_node = node.insert_before(hlist_node.head, prev_head_node, kern_node) + hlist_node.head = prev_head_node.prev + return hlist_node, strut_node, prev_head_node end --- Write kern nodes to the current node list. This kern nodes can be used @@ -283,14 +278,14 @@ function nodex.write_margin() node.write(kern) end ---- Search for a `hlist` (subtype `line`). --- --- Insert a strut node into the list if a hlist is found. +--- Search for a `hlist` (subtype `line`) and nsert a strut node into +-- the list if a hlist is found. -- -- @tparam node head_node The head of a node list. -- --- @treturn node|false Return false, if no `hlist` can --- be found. +-- @treturn node hlist_node +-- @treturn node strut_node +-- @treturn node prev_head_node local function search_hlist(head_node) while head_node do if head_node.id == node.id('hlist') and head_node.subtype == 1 then @@ -298,7 +293,6 @@ local function search_hlist(head_node) end head_node = head_node.next end - return false end --- Option handling. @@ -330,7 +324,7 @@ function registry.create_marker(index) return marker end ---- Write a marker node to \TeX's current node list. +--- Write a marker node to TeX's current node list. -- -- The argument `mode` accepts the string values `basic`, `fix` and -- `par`. The argument `position`. The argument `position` is either set @@ -410,8 +404,13 @@ end --- This function removes a given whatsit marker. -- -- It only deletes a node, if a marker is given. +-- +-- @treturn node head +-- @treturn node current function registry.remove_marker(marker) - if registry.is_marker(marker) then node.remove(marker, marker) end + if registry.is_marker(marker) then + return node.remove(marker, marker) + end end -- __Storage functions (storage)__ @@ -536,280 +535,296 @@ end --- Assembly to cloze texts. -- @section cloze_functions ---- The function `cloze.basic_make()` makes one gap. The argument `start` --- is the node, where the gap begins. The argument `stop` is the node, --- where the gap ends. -function cloze.basic_make(start_node, end_node) - local node_head = start_node - if not start_node or not end_node then - return - end - local line_width = node.dimensions( - cloze.status.hlist.glue_set, - cloze.status.hlist.glue_sign, - cloze.status.hlist.glue_order, - start_node, - end_node - ) - local line_node = nodex.insert_line(start_node, line_width) - local color_text_node = nodex.insert_list('after', line_node, {nodex.create_color('text')}) - if registry.get_value_show() then - nodex.insert_list('after', color_text_node, {create_kern_node(-line_width)}) - nodex.insert_list('before', end_node, {nodex.create_color('reset')}, node_head) - else - line_node.next = end_node.next - end_node.prev = line_node -- not line_node.prev -> line color leaks out - end - -- In some edge cases the lua callbacks get fired up twice. After the - -- cloze has been created, the start and stop whatsit markers can be - -- deleted. - registry.remove_marker(start_node) - registry.remove_marker(end_node) -end - ---- Search for a stop marker. --- --- @tparam node head_node The head of a node list. +--- Assemble a possibly muliline cloze. -- --- @treturn node The end node. -function cloze.basic_search_stop(head_node) - local end_node - while head_node do - cloze.status.continue = true - end_node = head_node - if registry.check_marker(end_node, 'basic', 'stop') then - cloze.status.continue = false - break - end - head_node = head_node.next - end - return end_node -end - ---- Search for a start marker or begin a new cloze if the value --- `cloze.status.continue` is true. +-- The corresponding LaTeX command to this Lua function is `\cloze`. +-- This function is used by other cloze TeX macros too: `\clozenol`, +-- `\clozefil` -- --- We have to find a hlist node and use its on the field `head` --- attached node list to search for a start marker. +-- @tparam node head_node_input The head of a node list. -- --- @tparam node head_node The head of a node list. -function cloze.basic_search_start(head_node) - local start_node, end_node, hlist_node - if cloze.status.continue then - hlist_node = search_hlist(head_node) - if hlist_node then - cloze.status.hlist = hlist_node - start_node = hlist_node.head +-- @treturn node The head of the node list. +local function make_basic(head_node_input) + -- This local variables are overloaded by function who + -- call each other. + local continue_cloze, search_stop + + --- The function `make_single()` makes one gap. The argument + -- `start_node` is the node where the gap begins. The argument + -- `stop_node` is the node where the gap ends. + -- + -- @tparam node start_node The node to start / begin a new cloze. + -- @tparam node stop_node The node to stop / end a new cloze. + -- @tparam node parent_node The parent node (hlist) of the start and + -- the stop node. + -- + -- @treturn node stop_node The stop node. + -- @treturn parent_node The parent node (hlist) of the stop node. + local function make_single(start_node, stop_node, parent_node) + local node_head = start_node + local line_width = node.dimensions( + parent_node.glue_set, + parent_node.glue_sign, + parent_node.glue_order, + start_node, + stop_node + ) + local line_node = nodex.insert_line(start_node, line_width) + local color_text_node = nodex.insert_list('after', line_node, {nodex.create_color('text')}) + if registry.get_value_show() then + nodex.insert_list('after', color_text_node, {create_kern_node(-line_width)}) + nodex.insert_list('before', stop_node, {nodex.create_color('reset')}, node_head) + else + line_node.next = stop_node.next + stop_node.prev = line_node -- not line_node.prev -> line color leaks out end - elseif registry.check_marker(head_node, 'basic', 'start') then - start_node = head_node - end - if start_node then - end_node = cloze.basic_search_stop(start_node) - cloze.basic_make(start_node, end_node) + -- In some edge cases the lua callbacks get fired up twice. After the + -- cloze has been created, the start and stop whatsit markers can be + -- deleted. + registry.remove_marker(start_node) + return registry.remove_marker(stop_node), parent_node end -end ---- Parse the node tree recursivley. --- --- Start and end markers could be nested deeply in the node tree. --- --- @tparam node head_node The head of a node list. -function cloze.basic_recursion(head_node) - while head_node do - if head_node.head then - cloze.status.hlist = head_node - cloze.basic_recursion(head_node.head) + --- Search for a stop marker or make a cloze up to the end of the node + -- list. + -- + -- @tparam node start_node The node to start a new cloze. + -- @tparam node parent_node The parent node (hlist) of the start node. + -- + -- @treturn head_node The fast forwarded new head of the node list. + -- @treturn parent_node The parent node (hlist) of the head node. + function search_stop(start_node, parent_node) + local head_node = start_node + local last_node + while head_node do + if registry.check_marker(head_node, 'basic', 'stop') then + return make_single(start_node, head_node, parent_node) + end + last_node = head_node + head_node = head_node.next + end + -- Make a cloze until the end of the node list. + head_node = make_single(start_node, last_node, parent_node) + if parent_node.next then + return continue_cloze(parent_node.next) else - cloze.basic_search_start(head_node) + return head_node, parent_node end - head_node = head_node.next end -end ---- The corresponding LaTeX command to this lua function is `\cloze`. --- --- @tparam node head_node The head of a node list. --- --- @treturn node The head of the node list. -function cloze.basic(head_node) - cloze.status.continue = false - cloze.basic_recursion(head_node) - return head_node -end + --- Continue a multiline cloze. + -- + -- @tparam node parent_node A parent node to search for a hlist node. + -- + -- @treturn head_node The fast forwarded new head of the node list. + -- @treturn parent_node The parent node (hlist) of the head node. + function continue_cloze(parent_node) + local hlist_node = search_hlist(parent_node) + if hlist_node then + local start_node = hlist_node.head + return search_stop(start_node, hlist_node) + end + end ---- Calculate the length of the whitespace before (`l.kern_start`) and --- after (`l.kern_stop`) the text. -function cloze.fix_length(start, stop) - local l = {} - l.width = tex.sp(registry.get_value('width')) - l.text_width = node.dimensions(start, stop) - l.align = registry.get_value('align') - if l.align == 'right' then - l.kern_start = - l.text_width - l.kern_stop = 0 - elseif l.align == 'center' then - l.half = (l.width - l.text_width) / 2 - l.kern_start = - l.half - l.text_width - l.kern_stop = l.half - else - l.kern_start = - l.width - l.kern_stop = l.width - l.text_width + --- Search for a start marker. + -- + -- @tparam node head_node The head of a node list. + -- @tparam node parent_node The parent node (hlist) of the head node. + local function search_start(head_node, parent_node) + while head_node do + if head_node.head then + search_start(head_node.head, head_node) + elseif registry.check_marker(head_node, 'basic', 'start') and + parent_node and + parent_node.id == node.id('hlist') then + -- Adds also a strut at the first position. It prepars the + -- hlist and makes it ready to build a cloze. + search_hlist(parent_node) + head_node, parent_node = search_stop(head_node, parent_node) + end + if head_node then + head_node = head_node.next + else + break + end + end end - return l.width, l.kern_start, l.kern_stop + + search_start(head_node_input) + return head_node_input end ---- The function `cloze.fix_make` generates a gap of fixed width. --- --- __Node lists__ --- --- __Show text:__ --- ---
`n.color_line``color_line_node``whatsit``pdf_colorstack`Line color
`n.line``line_node``rule``width`
`n.color_reset``color_reset_node``whatsit``pdf_colorstack`Reset color
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
`n.start``whatsit``user_definded``index`
`n.line``rule``l.width`
`n.kern_start``kern`& Depends on `align`
`n.color_text``whatsit``pdf_colorstack`Text color
`glyphs`& Text to show
`n.color_reset``whatsit``pdf_colorstack`Reset color
`n.kern_stop``kern`& Depends on `align`
`n.stop``whatsit``user_definded``index`
--- --- __Hide text:__ --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
`n.start``whatsit``user_definded``index`
`n.line``rule``l.width`
`n.stop``whatsit``user_definded``index`
+--- The corresponding LaTeX command to this Lua function is `\clozefix`. -- --- Make fixed size cloze. --- --- @param start The node, where the gap begins --- @param stop The node, where the gap ends -function cloze.fix_make(start, stop) - local l = {} -- length - local n = {} -- node - l.width, l.kern_start, l.kern_stop = cloze.fix_length(start, stop) - n.line = nodex.insert_line(start, l.width) - if registry.get_value_show() then - nodex.insert_list( - 'after', - n.line, - { - create_kern_node(l.kern_start), - nodex.create_color('text') - } - ) - nodex.insert_list( - 'before', - stop, - { - nodex.create_color('reset'), - create_kern_node(l.kern_stop) - }, - start - ) - else - n.line.next = stop.next +-- @tparam node head_node_input The head of a node list. +local function make_fix(head_node_input) + + --- Calculate the length of the whitespace before (`kern_start_length`) and + -- after (`kern_stop_length`) the text. + local function calculate_length(start, stop) + local width, kern_start_length, kern_stop_length, text_width, half_length, align + width = tex.sp(registry.get_value('width')) + text_width = node.dimensions(start, stop) + align = registry.get_value('align') + if align == 'right' then + kern_start_length = - text_width + kern_stop_length = 0 + elseif align == 'center' then + half_length = (width - text_width) / 2 + kern_start_length = - half_length - text_width + kern_stop_length = half_length + else + kern_start_length = - width + kern_stop_length = width - text_width + end + return width, kern_start_length, kern_stop_length end - registry.remove_marker(start) - registry.remove_marker(stop) -end ---- Function to recurse the node list and search after marker. --- --- @tparam node head_node The head of a node list. -function cloze.fix_recursion(head_node) - local n = {} -- node - n.start, n.stop = false - while head_node do - if head_node.head then - cloze.fix_recursion(head_node.head) + --- The function `make_single` generates a gap of fixed width. + -- + -- __Node lists__ + -- + -- __Show text:__ + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + --
`start_node``whatsit``user_definded``index`
`line_node``rule``width`
`kern_start_node``kern`& Depends on `align`
`color_text_node``whatsit``pdf_colorstack`Text color
`glyphs`& Text to show
`color_reset_node``whatsit``pdf_colorstack`Reset color
`kern_stop_node``kern`& Depends on `align`
`stop_node``whatsit``user_definded``index`
+ -- + -- __Hide text:__ + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + -- + --
`start_node``whatsit``user_definded``index`
`line_node``rule``width`
`stop_node``whatsit``user_definded``index`
+ -- + -- Make fixed size cloze. + -- + -- @param start The node, where the gap begins + -- @param stop The node, where the gap ends + local function make_single(start, stop) + local width, kern_start_length, kern_stop_length, line_node + width, kern_start_length, kern_stop_length = calculate_length(start, stop) + line_node = nodex.insert_line(start, width) + if registry.get_value_show() then + nodex.insert_list( + 'after', + line_node, + { + create_kern_node(kern_start_length), + nodex.create_color('text') + } + ) + nodex.insert_list( + 'before', + stop, + { + nodex.create_color('reset'), + create_kern_node(kern_stop_length) + }, + start + ) else - if not n.start then - n.start = registry.get_marker(head_node, 'fix', 'start') - end - if not n.stop then - n.stop = registry.get_marker(head_node, 'fix', 'stop') - end - if n.start and n.stop then - cloze.fix_make(n.start, n.stop) - n.start, n.stop = false + line_node.next = stop.next + end + registry.remove_marker(start) + registry.remove_marker(stop) + end + + --- Function to recurse the node list and search after marker. + -- + -- @tparam node head_node The head of a node list. + local function make_fix_recursion(head_node) + local start_node, stop_node = false, false + while head_node do + if head_node.head then + make_fix_recursion(head_node.head) + else + if not start_node then + start_node = registry.get_marker(head_node, 'fix', 'start') + end + if not stop_node then + stop_node = registry.get_marker(head_node, 'fix', 'stop') + end + if start_node and stop_node then + make_single(start_node, stop_node) + start_node, stop_node = false, false + end end + head_node = head_node.next end - head_node = head_node.next end -end ---- The corresponding LaTeX command to this Lua function is `\clozefix`. --- --- @tparam node head_node The head of a node list. -function cloze.fix(head_node) - cloze.fix_recursion(head_node) - return head_node + make_fix_recursion(head_node_input) + return head_node_input end --- The corresponding LaTeX environment to this lua function is @@ -822,7 +837,7 @@ end -- -- -- --- +-- -- -- -- @@ -830,19 +845,19 @@ end -- -- -- --- +-- -- -- --- +-- -- -- --- +-- -- -- --- +-- -- -- --- +-- -- -- -- @@ -854,13 +869,13 @@ end -- -- -- --- +-- -- -- -- -- -- --- +-- -- -- -- @@ -873,7 +888,7 @@ end --
`n.strut``strut_node``kern`width = 0
`n.line``line_node``rule``l.width` (Width from hlist)`width` (Width from hlist)
`n.kern``kern_node``kern``-l.width``-width`
`n.color_text``color_text_node``whatsit``pdf_colorstack`Text colorText to show
`n.tail``tail_node``glyph`Last glyph in hlist
`n.color_reset``color_reset_node``whatsit``pdf_colorstack`Reset color
-- -- --- +-- -- -- -- @@ -881,31 +896,30 @@ end -- -- -- --- +-- -- -- --- +-- -- -- --
`n.strut``strut_node``kern`width = 0
`n.line``line_node``rule``l.width` (Width from hlist)`width` (Width from hlist)
-- -- @tparam node head_node The head of a node list. -function cloze.par(head_node) - local l = {} -- length - local n = {} -- node - for hlist in node.traverse_id(node.id('hlist'), head_node) do - for whatsit in node.traverse_id(node.id('whatsit'), hlist.head) do +local function make_par(head_node) + local strut_node, line_node, width + for hlist_node in node.traverse_id(node.id('hlist'), head_node) do + for whatsit in node.traverse_id(node.id('whatsit'), hlist_node.head) do registry.get_marker(whatsit, 'par', 'start') end - l.width = hlist.width - hlist, n.strut, n.head = insert_strut_into_hlist(hlist) - n.line = nodex.insert_line(n.strut, l.width) + width = hlist_node.width + hlist_node, strut_node, _ = insert_strut_into_hlist(hlist_node) + line_node = nodex.insert_line(strut_node, width) if registry.get_value_show() then nodex.insert_list( 'after', - n.line, + line_node, { - create_kern_node(-l.width), + create_kern_node(-width), nodex.create_color('text') } ) @@ -915,53 +929,82 @@ function cloze.par(head_node) {nodex.create_color('reset')} ) else - n.line.next = nil + line_node.next = nil end end return head_node end +--- +-- @tparam string callback_name The name of a callback +-- @tparam function func A function to register for the callback +-- @tparam string description Only used in LuaLatex +local function register_callback(callback_name, func, description) + if luatexbase then + luatexbase.add_to_callback( + callback_name, + func, + description + ) + else + callback.register(callback_name, func) + end +end + +--- +-- @tparam string callback_name The name of a callback +-- @tparam string description Only used in LuaLatex +local function unregister_callback(callback_name, description) + if luatexbase then + luatexbase.remove_from_callback( + callback_name, + description + ) + else + callback.register(callback_name, nil) + end +end + --- Basic module functions. -- The `base` table contains functions which are published to the -- `cloze.sty` file. -- @section base ---- This function registers the functions `cloze.par`, `cloze.basic` and --- `cloze.fix` the Lua callbacks. +--- This function registers the functions `make_par`, `make_basic` and +-- `make_fix` the Lua callbacks. -- --- `cloze.par` and `cloze.basic` are registered to the callback --- `post_linebreak_filter` and `cloze.fix` to the callback +-- `make_par` and `make_basic` are registered to the callback +-- `post_linebreak_filter` and `make_fix` to the callback -- `pre_linebreak_filter`. The argument `mode` accepts the string values -- `basic`, `fix` and `par`. A special treatment is needed for clozes in -- display math mode. The `post_linebreak_filter` is not called on -- display math formulas. I’m not sure if the `pre_output_filter` is the -- right choice to capture the display math formulas. function base.register(mode) - local basic if mode == 'par' then - luatexbase.add_to_callback( + register_callback( 'post_linebreak_filter', - cloze.par, + make_par, mode ) return true end if not base.is_registered[mode] then if mode == 'basic' then - luatexbase.add_to_callback( + register_callback( 'post_linebreak_filter', - cloze.basic, + make_basic, mode ) - luatexbase.add_to_callback( + register_callback( 'pre_output_filter', - cloze.basic, + make_basic, mode ) elseif mode == 'fix' then - luatexbase.add_to_callback( + register_callback( 'pre_linebreak_filter', - cloze.fix, + make_fix, mode ) else @@ -978,12 +1021,12 @@ end -- `basic`, `fix` and `par`. function base.unregister(mode) if mode == 'basic' then - luatexbase.remove_from_callback('post_linebreak_filter', mode) - luatexbase.remove_from_callback('pre_output_filter', mode) + unregister_callback('post_linebreak_filter', mode) + unregister_callback('pre_output_filter', mode) elseif mode == 'fix' then - luatexbase.remove_from_callback('pre_linebreak_filter', mode) + unregister_callback('pre_linebreak_filter', mode) else - luatexbase.remove_from_callback('post_linebreak_filter', mode) + unregister_callback('post_linebreak_filter', mode) end end diff --git a/Master/texmf-dist/source/lualatex/cloze/cloze.dtx b/Master/texmf-dist/source/lualatex/cloze/cloze.dtx deleted file mode 100644 index f2ec1be8c53..00000000000 --- a/Master/texmf-dist/source/lualatex/cloze/cloze.dtx +++ /dev/null @@ -1,1929 +0,0 @@ -% \iffalse meta-comment -% -% Copyright (C) 2015-2020 by Josef Friedrich -% ---------------------------------------------------------------------- -% 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} -% -%\NeedsTeXFormat{LaTeX2e}[1999/12/01] -%\ProvidesPackage{cloze} -%<*package> - [2020/05/27 v1.5 Package to typeset cloze worksheets or cloze tests] -% -%<*driver> -\documentclass{ltxdoc} -\usepackage[show]{cloze} -\usepackage{graphicx} -\usepackage{paralist} -\usepackage{titlesec} -\usepackage{mdframed} -\titleformat{\paragraph}[hang]{% - \normalfont\normalsize\bfseries% - }{\theparagraph}{1em}{} -\titleformat{\subparagraph}[hang]{% - \normalfont\small\bfseries% - }{\thesubparagraph}{1em}{} - \titlespacing*{\subparagraph}{0pt}{*1}{0pt} - -\usepackage[ - colorlinks=true, - linkcolor=red, - filecolor=red, - urlcolor=red, -]{hyperref} - -\usepackage{minted} -\usemintedstyle{colorful} -\BeforeBeginEnvironment{minted}{\begin{mdframed}[backgroundcolor=gray!3]} -\AfterEndEnvironment{minted}{\end{mdframed}} -\setminted{ - breaklines=true, - fontsize=\footnotesize, -} - - -\MakeShortVerb{\|} - -\setlength{\fboxrule}{0.2pt} -\setlength{\fboxsep}{4pt} - -\makeatletter -\newcommand{\@minipagerestore}{\setlength{\parindent}{10pt}} -\makeatother - -\newmdenv{example} -\definecolor{graybackground}{gray}{0.97} -\surroundwithmdframed[backgroundcolor=graybackground]{verbatim} - -\newcommand{\getdefaults}[1]{% - \directlua{tex.print(cloze.get_defaults('#1'))}% -} - -\newcommand{\expdesc}[1]{(|#1|)} - -\newcommand{\desc}[1]{% - \hfill% - \expdesc{#1}% - \par% -} - -\def\tt#1{\texttt{#1}} - -\def\secref#1{(\rightarrow\ \ref{#1})} - -\newcommand{\option}[2]{\tt{[#1=}\meta{#2}\tt{]}} -\newcommand{\clozeluafunction}[1]{ - \marginpar{% - \raggedleft% - \MacroFont% - \tt{% - \scantokens{\catcode`\_=12\relax#1}% - }% - }% -} - -\newcommand{\nodelisthfont}{\bfseries\sffamily} - -\newcommand{\nodelistheader}{ - \hline - \nodelisthfont Variable name & - \nodelisthfont Node type & - \nodelisthfont Node subtype & - \nodelisthfont Parameter \\ - \hline -} - -\newenvironment{nodelist}{ - \noindent - \begingroup - \footnotesize - \begin{tabular}{llll} - \nodelistheader -}{ - \hline - \end{tabular} - \endgroup -} - -\EnableCrossrefs -\CodelineIndex -\RecordChanges -\begin{document} - -\providecommand*{\url}{\texttt} -\GetFileInfo{cloze.dtx} -\title{The \cloze{cloze} package% - \thanks{Many thanks to Robert-Michael Huber for his advice -and to Paul Isambert for his article \emph{"Three things you can do with -Lua\TeX{} that would be extremely painful otherwise"} in TUGboat, Volume -31 (2010), No. 3. This article helped a lot to write this package.}% -} -\author{% - Josef Friedrich\\% - \url{josef@friedrich.rocks}\\% - \href{https://github.com/Josef-Friedrich/cloze}{github.com/Josef-Friedrich/cloze}% -} -\date{\fileversion~from \filedate} - -\maketitle\vfill - -\pagebreak - -\setcounter{secnumdepth}{5} -\setcounter{tocdepth}{5} -\tableofcontents - -%----------------------------------------------------------------------- -% Introduction -%----------------------------------------------------------------------- - -\pagebreak -\section{Introduction} - -\emph{cloze} is a \LaTeX{} package to generate cloze texts. It uses -the capabilities of the modern \TeX{} engine \emph{Lua\TeX}. Therefore, -you must use Lua\LaTeX{} to create documents containing gaps. - -\begin{verbatim} -lualatex cloze-text.tex -\end{verbatim} - -The main feature of the package is that the formatting doesn't change -when using the |hide| and |show| \secref{sec:option-hide} options. - -\newcommand{\clozelorem}{% -Lorem ipsum \cloze{dolor sit} amet, consectetur \cloze{adipisicing} -elit, sed do eiusmod tempor incididunt ut labore et \cloze{dolore magna} -aliqua. Ut enim ad minim veniam, quis nostrud \cloze{exercitation} -ullamco laboris nisi ut \cloze{aliquip} ex ea commodo consequat.% -} - -\begin{example} -\clozelorem -\end{example} - -\clozeset{hide} - -The command |\clozeset{hide}| only shows gaps. When you put both texts -on top of each other you will see that they perfectly match. - -\begin{example} -\clozelorem -\end{example} - -\clozeset{show} - -%----------------------------------------------------------------------- -% Usage -%----------------------------------------------------------------------- - -\section{Usage} - -There are the commands -\cmd{\cloze}, -\cmd{\clozefix}, -\cmd{\clozefil}, -\cmd{\clozenol}, -\cmd{\clozestrike} and the environments -|clozepar| and -|clozebox| -to generate cloze texts. - -%% -% \cloze -%% - -\subsection{The commands and environments} - -\subsubsection{\cmd{\cloze}} -\label{sec:command-cloze} - -\DescribeMacro{\cloze} \cmd{\cloze}\oarg{options}\marg{some text}: The -command \cmd{\cloze} is similar to a command that offers the possibility -to underline the texts. \cmd{\cloze} does not prevent line breaks. The -width of a gap depends on the number of letters and the font used. -The only option which affects the widths of a gap is the option -|margin| \secref{sec:option-margin}. - -\begin{example} -Lorem ipsum \cloze{dolor} sit amet, \cloze{consectetur} adipisicing -elit, sed do eiusmod tempor incididunt ut labore et dolore -\cloze{magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation -ullamco laboris nisi} ut aliquip ex ea commodo consequat. -\end{example} - -\noindent It is possible to convert a complete paragraph into a `gap'. -But don't forget: There is a special environment for this: \tt{clozepar} -\secref{sec:command-clozepar}. - -\begin{example} -\cloze{Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do -eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad -minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip -ex ea commodo consequat.} -\end{example} - -\noindent The command \cmd{\cloze} doesn't change the behavior of the -hyphenation. Let's try some long German words: - -\begin{example} -es -\cloze{Te\-le\-kom\-mu\-ni\-ka\-tions\-ü\-ber\-wach\-ung} -geht -\cloze{Un\-ter\-neh\-mens\-steu\-er\-fort\-ent\-wick\-lungs\-ge\-setz} -\cloze{Ab\-teil\-ungs\-lei\-ter\-in} -\cloze{Ober\-kom\-mi\-sar\-in} -auch -\cloze{Fil\-lial\-lei\-ter\-in} -kurz -\cloze{Ober\-kom\-mi\-sar\-in} -\cloze{Un\-ter\-neh\-mens\-steu\-er\-fort\-ent\-wick\-lungs\-ge\-setz} -\cloze{Fil\-lial\-lei\-ter\-in} -\cloze{Metz\-ger\-mei\-ster\-in} -in -\cloze{Ab\-teil\-ungs\-lei\-ter\-in} -der -\cloze{Ober\-kom\-mi\-sar\-in} -\cloze{Hoch\-lei\-stungs\-flüs\-sig\-keits\-chro\-ma\-to\-gra\-phie} -\cloze{Fil\-lial\-lei\-ter\-in} -Kürze -\cloze{Un\-ter\-neh\-mens\-steu\-er\-fort\-ent\-wick\-lungs\-ge\-setz} -\cloze{Metz\-ger\-mei\-ster\-in} -liegt -\cloze{Ab\-teil\-ungs\-lei\-ter\-in} -die -\cloze{Metz\-ger\-mei\-ster\-in} -\cloze{Ab\-teil\-ungs\-lei\-ter\-in} -Würze -\cloze{Ober\-kom\-mi\-sar\-in} -\end{example} - -%% -% \clozesetfont -%% - -\subsubsection{\cmd{\clozesetfont}} -\label{sec:command-clozesetfont} -\label{sec:command-clozefont} - -\DescribeMacro{\clozesetfont} -The gap font can be changed by using the command -\cmd{\clozesetfont}. \tt{\string\cloze\-set\-font} redefines the command -\cmd{\clozefont} which contains the font definition. -Thus, the command \tt{\string\clozesetfont\string{\string\Large\string}} -has the same effect as -\tt{\string\re\-new\-com\-mand\string{\string\cloze\-font\string}% -\string{\string\Large\string}}. - -\clozesetfont{\Large} - -\begin{example} -Excepteur \cloze{sint} occaecat \cloze{cupidatat} non proident. -\end{example} - -\noindent Please do not put any color definitions in -\cmd{\clozesetfont}, as it won't work. Use the option -|textcolor| instead \secref{sec:option-textcolor}. - -|\clozesetfont{\ttfamily\normalsize}| changes the gap text for example -into a normal sized typewriter font. - -\clozesetfont{\ttfamily\normalsize} - -\begin{example} -Excepteur \cloze{sint} occaecat \cloze{cupidatat} non proident. -\end{example} - -\clozesetfont{\itshape} - -%% -% \clozefix -%% - -\subsubsection{\cmd{\clozefix}} -\label{sec:command-clozefix} - -\DescribeMacro{\clozefix} \cmd{\clozefix}\oarg{options}\marg{some text}: -The command \cmd{\clozefix} creates gaps with a fixed width. The -clozes are default concering the width \tt{\getdefaults{width}}. - -\begin{example} -\noindent Lorem ipsum dolor sit amet: -\begin{compactenum} -\item \clozefix[width=5cm]{consectetur} -\item \clozefix[width=5cm]{adipisicing} -\item \clozefix[width=5cm]{elit} -\end{compactenum} -sed do eiusmod. -\end{example} - -Gaps with a fixed width are much harder to solve. - -\begin{example} -Lorem ipsum dolor \clozefix[align=center,width=3cm]{sit} amet, -\clozefix[align=center,width=3cm]{consectetur} adipisicing elit, sed do -eiusmod tempor incididunt \clozefix[align=center,width=3cm]{ut} labore -et dolore magna aliqua. -\end{example} - -Using the option |align| you can make nice tabulars like this: - -\begin{example} -\begin{tabular}{p{5cm}p{4cm}} -\raggedleft Composer & Life span \\ -\clozefix[width=5cm,align=right]{Joseph Haydn} & \clozefix{1723-1809} \\ -\clozefix[width=5cm,align=right]{Wolfgang Amadeus Mozart} & \clozefix{1756-1791} \\ -\clozefix[width=5cm,align=right]{Ludwig van Beethoven} & \clozefix{1770-1827} \\ -\end{tabular} -\end{example} - -%% -% \clozenol -%% - -\subsubsection{\cmd{\clozenol}} -\label{sec:command-clozenol} -\DescribeMacro{\clozenol} \cmd{\clozenol}\oarg{options}\marg{some text}: -The macro name |clozenol| stands for \emph{“cloze no line”}. As the -the name suggests this macro typesets cloze texts without a line. - -\begin{minted}{latex} -Lorem \clozenol{ipsum dolor} sit amet. -\end{minted} - -\begin{example} -Lorem \clozenol{ipsum dolor} sit amet. -\end{example} - -\begin{minted}{latex} -Lorem \clozenol[textcolor=green]{ipsum dolor} sit amet. -\end{minted} - -\begin{example} -Lorem \clozenol[textcolor=green]{ipsum dolor} sit amet. -\end{example} - -%% -% \clozefil -%% - -\subsubsection{\cmd{\clozefil}} -\label{sec:command-clozefil} - -\DescribeMacro{\clozefil} \cmd{\clozefil}\oarg{options}\marg{some text}: -The name of the command is inspired by \cmd{\hfil}, \cmd{\hfill}, and -\cmd{\hfilll}. Only \cmd{\clozefil} fills out all available horizontal -spaces with a line. - -\begin{example} -Lorem ipsum dolor sit amet, \clozefil{consectetur adipisicing elit, sed -do eiusmod.} - -Ut enim \clozefil{ad minim veniam} exercitation. -\end{example} - -%% -% \clozeextend -%% - -\subsubsection{\cmd{\clozeextend}} -\label{sec:command-clozeextend} - -\DescribeMacro{\clozeextend} \cmd{\clozeextend}\oarg{spaces}: -The command |\clozeextend| adds some invisible placeholders to extend -some cloze texts with blank space. - -\begin{minted}{latex} -\begin{itemize} -\item \clozefil{Lorem ipsum dolor sit amet, consectetur adipisicing -elit, sed do eiusmod tempor incididunt ut labore et dolore magna -aliqua.} -\item \clozefil{Ut enim ad minim veniam \clozeextend[20]} -\item \clozefil{quis nostrud \clozeextend[20]} -\end{itemize} -\end{minted} - -\begin{example} -\begin{itemize} -\item \clozefil{Lorem ipsum dolor sit amet, consectetur adipisicing -elit, sed do eiusmod tempor incididunt ut labore et dolore magna -aliqua.} -\item \clozefil{Ut enim ad minim veniam \clozeextend[20]} -\item \clozefil{quis nostrud \clozeextend[20]} -\end{itemize} -\end{example} - -%% -% clozepar -%% - -\subsubsection{\tt{clozepar}} -\label{sec:command-clozepar} - -\DescribeEnv{clozepar} |\begin{clozepar}|\oarg{options} \dots -\textit{some text} \dots |\end{clozepar}|: The environment \tt{clozepar} -transforms a complete paragraph into a cloze text. The options |align|, -|margin| and |width| have no effect on this environment. - -\begin{example} -Lorem ipsum dolor sit amet, consectetur adipisicing elit ullamco laboris -nisi. - -\begin{clozepar} -Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi -ut aliquip ex ea commodo consequat. Duis aute irure dolor in -reprehenderit in voluptate velit esse cillum. -\end{clozepar} - -Excepteur sint occaecat cupidatat non proident. -\end{example} - -%% -% clozebox -%% - -\subsubsection{\tt{clozebox}} -\label{sec:command-clozebox} - -\DescribeEnv{clozebox} |\begin{clozebox}|*\oarg{options} \dots -\textit{some text} \dots |\end{clozebox}|: The environment \tt{clozebox} -surrounds a text with a box. The starred version omits the line -around the box. Use the options |boxwidth| and |boxheight| to specify -the dimensions of the box. By default the width of the box is -|\linewidth|. - -\begin{minted}{latex} -\begin{clozebox} -Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod -tempor incididunt ut labore et dolore magna aliqua. -\end{clozebox} -\end{minted} - -\bigskip -\noindent -|\clozehide| -\clozehide -\bigskip - -\begin{center} -\begin{clozebox}[boxwidth=8cm] -Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod -tempor incididunt ut labore et dolore magna aliqua. -\end{clozebox} -\end{center} - -\bigskip -\noindent -|\clozeshow| -\clozeshow -\bigskip - -\begin{center} -\begin{clozebox}[boxwidth=8cm] -Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod -tempor incididunt ut labore et dolore magna aliqua. -\end{clozebox} -\end{center} - -\paragraph{Option boxwidth} -\label{sec:command-clozebox-boxwidth} -See the documentation about the option \secref{sec:option-boxwidth}. - -\begin{minted}{latex} -\begin{clozebox}[boxwidth=5cm] -Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod -tempor incididunt ut labore et dolore magna aliqua. -\end{clozebox} -\end{minted} - -\begin{center} -\begin{clozebox}[boxwidth=5cm] -Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod -tempor incididunt ut labore et dolore magna aliqua. -\end{clozebox} -\end{center} - -\paragraph{Option boxheight} -\label{sec:command-clozebox-boxheight} -See the documentation about the option \secref{sec:option-boxheight}. - -\begin{minted}{latex} -\begin{clozebox}[boxwidth=5cm,boxheight=5cm] -Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod -tempor incididunt ut labore et dolore magna aliqua. -\end{clozebox} -\end{minted} - -\begin{center} -\begin{clozebox}[boxwidth=5cm,boxheight=5cm] -Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod -tempor incididunt ut labore et dolore magna aliqua. -\end{clozebox} -\end{center} - -\paragraph{starred} - -% starred -\begin{minted}{latex} -\begin{clozebox}*[boxwidth=5cm,boxheight=5cm] -Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod -tempor incididunt ut labore et dolore magna aliqua. -\end{clozebox} -\end{minted} - -\begin{center} -\begin{clozebox}*[boxwidth=5cm,boxheight=5cm] -Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod -tempor incididunt ut labore et dolore magna aliqua. -\end{clozebox} -\end{center} - -%% -% clozespace -%% - -\subsubsection{\tt{clozespace}} -\label{sec:command-clozespace} - -\DescribeEnv{clozespace} |\begin{clozespace}|\oarg{options} \dots -\textit{some text} \dots |\end{clozespace}| - -\begin{minted}{latex} -\begin{clozespace}[spacing=2] -\clozesetfont{\ttfamily\Huge} -Lorem \cloze{ipsum} dolor sit \cloze{amet}, consectetur adipisicing -elit, sed do eiusmod tempor incididunt ut labore et dolore magna -aliqua. Ut enim ad minim veniam, quis \cloze{nostrud} -exercitation ullamco \cloze{laboris} nisi ut aliquip ex ea commodo -consequat. -\end{clozespace} -\end{minted} - -\begin{example} -\begin{clozespace}[spacing=2] -\clozesetfont{\ttfamily\Huge} -Lorem \cloze{ipsum} dolor sit \cloze{amet}, consectetur adipisicing -elit, sed do eiusmod tempor incididunt ut labore et dolore magna -aliqua. Ut enim ad minim veniam, quis \cloze{nostrud} -exercitation ullamco \cloze{laboris} nisi ut aliquip ex ea commodo -consequat. -\vspace{-0.8cm} -\end{clozespace} -\end{example} - -%% -% \clozeline -%% - -\subsubsection{\cmd{\clozeline}} -\label{sec:command-clozeline} - -\DescribeMacro{\clozeline} -\cmd{\clozeline}\oarg{options}: -To create a cloze line of a certain width, use the command -\cmd{\clozeline}. The default width of the line is -\tt{\getdefaults{width}}. In combination with the other cloze commands -you can create for example an irregular alignment of the cloze text. - -\begin{minted}{latex} -Ut enim ad -\clozeline[width=1cm]\cloze{minim}\clozeline[width=3cm] -minim veniam -\end{minted} - -\begin{example} -Ut enim ad \clozeline[width=1cm]\cloze{minim}\clozeline[width=3cm] minim -veniam, -\end{example} - -%% -% \clozelinefil -%% - -\subsubsection{\cmd{\clozelinefil}} -\label{sec:command-clozelinefil} - -\DescribeMacro{\clozelinefil} -\cmd{\clozelinefil}\oarg{options}: -This command \cmd{\clozelinefil} fills the -complete available horizontal space with a line. Moreover, -\cmd{\clozelinefil} was used to create \cmd{\clozefil}. - -\begin{example} -Lorem\clozelinefil -\end{example} - -%% -% \clozestrike -%% - -\subsubsection{\cmd{\clozestrike}} -\label{sec:command-clozelinefil} - -\DescribeMacro{\clozestrike} -\cmd{\clozestrike}\oarg{options}\marg{wrong text}\marg{correct text} - -\begin{minted}{latex} -Lorem \clozestrike{ipsum}{dolor} sit amet. -\end{minted} - -\begin{example} -Lorem \clozestrike{ipsum}{dolor} sit amet. -\end{example} - -\begin{minted}{latex} -Lorem \clozestrike[textcolor=red]{ipsum}{dolor} sit amet. -\end{minted} - -\begin{example} -Lorem \clozestrike[textcolor=red]{ipsum}{dolor} sit amet. -\end{example} - -\begin{example} -\begin{clozespace} -invidunt ut \clozestrike{labore}{et dolore magna aliquyam erat}, sed -diam voluptua. At \clozestrike{vero eos}{et accusam et justo} duo -dolores et ea \clozestrike{rebum. Stet}{clita kasd gubergren}, no sea -takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum -\clozestrike{dolor sit amet, consetetur }{sadipscing elitr, sed diam} -nonumy eirmod tempor invidunt ut labore et dolore magna -aliquyam erat, \clozestrike{sed diam voluptua}{At vero}. -\end{clozespace} -\end{example} - -\begin{example} -\clozehide -\begin{clozespace} -invidunt ut \clozestrike{labore}{et dolore magna aliquyam erat}, sed -diam voluptua. At \clozestrike{vero eos}{et accusam et justo} duo -dolores et ea \clozestrike{rebum. Stet}{clita kasd gubergren}, no sea -takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum -\clozestrike{dolor sit amet, consetetur }{sadipscing elitr, sed diam} -nonumy eirmod tempor invidunt ut labore et dolore magna -aliquyam erat, \clozestrike{sed diam voluptua}{At vero}. -\end{clozespace} -\clozeshow -\end{example} - -%----------------------------------------------------------------------- -% Options -%----------------------------------------------------------------------- - -\subsection{The options} - -%% -% Local and global options -%% - -\subsubsection{Local and global options} - -The \emph{cloze} package distinguishs between \emph{local} and -\emph{global} options. Besides the possiblity to set \emph{global} -options in the \cmd{\usepackage}\oarg{global options}\marg{cloze} -declaration, the cloze package offers a special command to set -\emph{global} options: -\cmd{\clozeset}\marg{global options} - -%% -% \clozeset -%% - -\subsubsection{\cmd{\clozeset}} -\label{sec:command-clozeset} - -\DescribeMacro{\clozeset} -\cmd{\clozeset}\marg{global options}: The command can set \emph{global} -options for each paragraph. - -\begin{minted}{latex} -\clozeset{textcolor=red} Lorem \cloze{ipsum} dolor \par -\clozeset{textcolor=green} Lorem \cloze{ipsum} dolor -\end{minted} - -\begin{example} -\clozeset{textcolor=red} Lorem \cloze{ipsum} dolor \par -\clozeset{textcolor=green} Lorem \cloze{ipsum} dolor -\end{example} - -\noindent \cmd{\clozeset} does not change the options within a -paragraph. As you can see in the example below the last \cmd{\clozeset} -applies the color green for both gaps. - -\begin{minted}{latex} -\clozeset{textcolor=red} Lorem \cloze{ipsum} dolor -\clozeset{textcolor=green} Lorem \cloze{ipsum} dolor -\end{minted} - -\begin{example} -\clozeset{textcolor=red} Lorem \cloze{ipsum} dolor -\clozeset{textcolor=green} Lorem \cloze{ipsum} dolor -\end{example} - -\clozereset - -%% -% \clozereset -%% - -\subsubsection{\cmd{\clozereset}} -\label{sec:command-clozereset} - -\DescribeMacro{\clozereset} -\cmd{\clozereset}: The command resets all \emph{global} options to the -default values. It has no effect on the \emph{local} options. - -\begin{minted}{latex} -\clozeset{ - thickness=3mm, - linecolor=yellow, - textcolor=magenta, - margin=-2pt -} -\end{minted} - -\clozeset{thickness=3mm,linecolor=yellow,textcolor=magenta,margin=-2pt} - -\begin{example} -Very \cloze{silly} global \cloze{options}. -\end{example} - -\begin{minted}{latex} -\clozereset -\end{minted} -\clozereset - -\begin{example} -\cloze{Relax!} We can reset \cloze{those} options. -\end{example} - -%% -% \clozereset -%% - -\subsubsection{\cmd{\clozeshow} and \cmd{\clozehide}} -\label{sec:command-clozeshow} -\label{sec:command-clozehide} - -\DescribeMacro{\clozeshow} \DescribeMacro{\clozehide} -\cmd{\clozeshow} and \cmd{\clozehide}: This commands are shortcuts for -\cmd{\clozeset}\marg{show} and \cmd{\clozeset}\marg{hide}. - -\begin{minted}{latex} -\clozehide -\end{minted} -\clozehide - -\begin{example} -Lorem \cloze{ipsum dolor sit} amet, consectetur \cloze{adipisicing} -elit. -\end{example} - -\begin{minted}{latex} -\clozeshow -\end{minted} -\clozeshow - -\begin{example} -Lorem \cloze{ipsum dolor sit} amet, consectetur \cloze{adipisicing} -elit. -\end{example} - -%% -% align -%% - -\subsubsection{\tt{align}} -\label{sec:option-align} - -\option{align}{left/center/right}: -Only the macro \cmd{\clozefix} \secref{sec:command-clozefix} takes the -option \tt{align} into account. Possible values are \tt{left}, -\tt{center} and \tt{right}. This option only makes sense, if the width -of the line is larger than the width of the text. - -\newcommand{\optionsalign}[1]{% - \noindent% - \clozefix[align=#1,width=8cm]{Lorem ipsum}% - \desc{#1}% -} - -\begin{example} -\optionsalign{left} -\optionsalign{center} -\optionsalign{right} -\end{example} - -%% -% boxheight -%% - -\subsubsection{\tt{boxheight}} -\label{sec:option-boxheight} - -|boxheight| specifies the height of a cloze box. This option has only -an effect on the environment |clozebox| \secref{sec:command-clozebox}. -An example can be found in the section about the environment -\secref{sec:command-clozebox-boxheight}. - -%% -% boxwidth -%% - -\subsubsection{\tt{boxwidth}} -\label{sec:option-boxwidth} - -|boxwidth| specifies the width of a cloze box. This option has only -an effect on the environment |clozebox| \secref{sec:command-clozebox}. -An example can be found in the section about the environment -\secref{sec:command-clozebox-boxwidth}. - -%% -% distance -%% - -\subsubsection{\tt{distance}} -\label{sec:option-distance} - -\option{distance}{dimen}: -The option |distance| specifies the spacing between the baseline of the -text and the gap line. The larger the dimension of the option -|distance|, the more moves the line down. Negative values cause the line -to appear above the baseline. The default value is -\tt{\getdefaults{distance}}. - -\newcommand{\optiondistance}[1]{% - \noindent% - \clozefil[distance=#1]{Lorem ipsum dolor sit amet.} - \expdesc{#1} - \par% -} - -\begin{example} -\optiondistance{\getdefaults{distance}} -\optiondistance{3pt} -\optiondistance{-3pt} -\end{example} - -%% -% hide and show -%% - -\subsubsection{\tt{hide} and \tt{show}} -\label{sec:option-hide} -\label{sec:option-show} - -\tt{[hide]} and \tt{[show]}: -By default the cloze text is displayed. Use the option |hide| to remove -the cloze text from the output. If you accidentally specify both -options -- |hide| and |show| -- the last option "wins". - -\newcommand{\optionshow}[1]{% - \noindent% - Lorem ipsum \cloze[#1]{dolor sit amet}, consectetur - \cloze[#1]{adipisicing} elit.% - \desc{#1}% -} - -\begin{example} -\optionshow{hide} -\optionshow{show} -\optionshow{show,hide} -\optionshow{hide,show} -\end{example} - -%% -% linecolor and textcolor -%% - -\subsubsection{\tt{linecolor} and \tt{textcolor}} -\label{sec:option-linecolor} -\label{sec:option-textcolor} - -\option{linecolor}{color name} and -\option{textcolor}{color name}: -Values for both color options are color names used by the xcolor -package. To define your own color use the following command: - -\begin{minted}{latex} -\definecolor{myclozecolor}{rgb}{0.1,0.4,0.6} -\cloze[textcolor=myclozecolor]{Lorem ipsum} -\end{minted} -\definecolor{myclozecolor}{rgb}{0.1,0.4,0.6} - -\newcommand{\optioncolor}[2]{% - \noindent% - \clozefil[#1=#2]{Lorem ipsum dolor sit amet, consectetur} % - \expdesc{#2}% - \par% -} - -\begin{example} -\optioncolor{textcolor}{myclozecolor} -\optioncolor{textcolor}{red} -\optioncolor{textcolor}{green} -\end{example} - -\noindent You can use the same color names to colorize the cloze lines. - -\begin{example} -\optioncolor{linecolor}{myclozecolor} -\optioncolor{linecolor}{red} -\optioncolor{linecolor}{green} -\end{example} - -\noindent -And now hide the clozes: - -\clozehide -\begin{example} -\optioncolor{linecolor}{myclozecolor} -\optioncolor{linecolor}{red} -\optioncolor{linecolor}{green} -\end{example} -\clozeshow - -%% -% margin -%% - -\subsubsection{\tt{margin}} -\label{sec:option-margin} - -\option{margin}{dimen}: -The option |margin| indicates how far the line sticks up from the text. -The option can be used with the commands \cmd{\cloze}, \cmd{\clozefix} -and \cmd{\clozefil}. The default value of the option is -\tt{\getdefaults{margin}}. - -\newcommand{\optionmargin}[1]{% - \noindent% - Lorem ipsum \cloze[margin=#1]{dolor} sit amet.% - \desc{#1}% -} - -\begin{example} -\optionmargin{0pt} -\optionmargin{5mm} -\optionmargin{1cm} -\optionmargin{6em} -\optionmargin{-4pt} -\end{example} - -% Folgt ein Satzzeichen direkt auf eine Lücke, so findet der -% Zeilenumbruch erst nach dem Satzzeichen statt. Auch ein noch so großer -% Wert für |margin| beeinflusst dieses Verhalten nicht. -\noindent Is a punctation mark placed directly after a gap, then the -line breaks after this punctation mark. Even the most large value of -|margin| does not affect this behavior. - -\begin{example} -\clozeset{margin=3mm} -\cloze{Lorem}, \cloze{ipsum}. \cloze{dolor}; \cloze{sit}: \cloze{amet}, -\cloze{consectetur}. \cloze{adipisicing}; \cloze{elit}: \cloze{sed}, -\cloze{do}. \cloze{eiusmod}; \cloze{tempor}. -\end{example} - -\clozereset - -%% -% spacing -%% - -\subsubsection{\tt{spacing}} -\label{sec:option-spacing} - -\option{spacing}{number}: This option provides support for setting the -spacing between lines. A larger font used for the cloze texts needs -more line space to avoid unsteady line distances. -This option only affects the environment |clozespace| -\secref{sec:command-clozespace}. - -%% -% thickness -%% - -\subsubsection{\tt{thickness}} -\label{sec:option-thickness} - -\option{thickness}{dimen}: -The option |thickness| indicates how thick the line is. The option -|distance| \secref{sec:option-distance} is not affected by this option, -because the bottom of the line moves down. The default value of this -option is \tt{\getdefaults{thickness}}. - -\newcommand{\optionthickness}[1]{% - \noindent% - Lorem \cloze[thickness=#1]{ipsum dolor sit} amet.% - \desc{#1}% -} - -\begin{example} -\optionthickness{0.01pt} -\optionthickness{1pt} -\optionthickness{2pt} -\end{example} - -%% -% width -%% - -\subsubsection{\tt{width}}\label{sec:option-width} - -\option{width}{dimen}: -The only command which can be changed by the option |width| is -\cmd{\clozefix} \secref{sec:command-clozefix}. The default value of the -option is \tt{\getdefaults{width}}. - -\newcommand{\optionwidth}[1]{% - \noindent% - Lorem \clozefix[width=#1]{dolor} amet.% - \desc{#1}% -} - -\begin{example} -\optionwidth{3cm} -\optionwidth{5cm} -\optionwidth{7cm} -\end{example} - -%----------------------------------------------------------------------- -% Special application areas -%----------------------------------------------------------------------- - -\subsection{Special application areas} - -This section lists examples that didn’t work in older versions of -the cloze package and required special treatment to work as expected. - -\subsubsection{The math mode} - -By default the package uses |\itshape| to format the cloze text. In -math mode you have to reset the cloze text format by calling -|\clozesetfont{}|. A known bug ist: You can’t show and hide -single display math formulas. Only the last |\clozeshow| or |\clozehide| -takes effect on the whole document. Side note: The usage of the \TeX -primitive syntax |$$| is not recommended. - -\clozesetfont{} - -\begin{minted}{latex} -\clozesetfont{} -$$1 + 1 = \cloze{2}$$ -\clozesetfont{\itshape} -\end{minted} - -$$1 + 1 = \cloze{2}$$ - -\noindent -|\[\]| should be used instead. - -\begin{minted}{latex} -\[123 + 456 = \cloze{579}\] -\end{minted} - -\[123 + 456 = \cloze{579}\] - -\begin{minted}{latex} -\begin{displaymath} -2^{\cloze{2}} = 4 -\end{displaymath} -\end{minted} - -\begin{displaymath} -2^{\cloze{2}} = 4 -\end{displaymath} - -\noindent -The inline math mode works too: - -\begin{minted}{latex} -${\sqrt[3]{\cloze{8}}} = 2$ and ${\sqrt[\cloze{3}]{\cloze{8}}} = 2$ -\end{minted} - -\begin{center} -${\sqrt[3]{\cloze{8}}} = 2$ and ${\sqrt[\cloze{3}]{\cloze{8}}} = 2$ -\end{center} - -\clozesetfont{\itshape} - -%% -% tabbing -%% - -\subsubsection{The \tt{tabbing} environment} - -\begin{minted}{latex} -\begin{tabbing} -col1 \hspace{1cm} \= col2 \hspace{1cm} \= col3 \hspace{1cm} \= col4 \\ -\cloze{col1} \> \> \clozefix{col3} \\ -\end{tabbing} -\end{minted} - -\begin{example} -\begin{tabbing} -col1 \hspace{1cm} \= col2 \hspace{1cm} \= col3 \hspace{1cm} \= col4 \\ -\cloze{col1} \> \> \clozefix{col3} \\ -\end{tabbing} -\end{example} - -%% -% picture -%% - -\subsubsection{The \tt{picture} environment} - -\begin{minted}{latex} -\begin{picture}(320,100) -\put(80,25){\cloze{Lorem}} -\put(160,50){\clozefix{ipsum}} -\put(240,75){\clozefil{dolor}} -\end{picture} -\end{minted} - -\begin{example} -\begin{picture}(320,100) -\put(80,25){\cloze{Lorem}} -\put(160,50){\clozefix{ipsum}} -\put(240,75){\clozefil{dolor}} -\end{picture} -\end{example} - -%% -% tabular -%% - -\subsubsection{The \tt{tabular} environment} - -\begin{minted}{latex} -\begin{tabular}{l c} -\cloze{Lorem} & \cloze{ipsum} \\ -\clozefix{amet} & \clozefix{consectetur} \\ -\cloze{sed} & \cloze{do} \\ -\end{tabular} -\end{minted} - -% No |c| inside because of short verbatim. - -\begin{example} -\clozeset{width=1cm} -\begin{tabular}{l c} -\cloze{Lorem} & \cloze{ipsum} \\ -\clozefix{amet} & \clozefix{consectetur} \\ -\cloze{sed} & \cloze{do} \\ -\end{tabular} -\end{example} - -\section{Some graphics for better understanding of the node tree} - -\subsection{Paragraph} - -\noindent\includegraphics[width=\linewidth]{graphics/par} - -\subsection{Tabular environment} - -\noindent\includegraphics[width=\linewidth]{graphics/tabular} - -\subsection{Picture environment} - -\noindent\includegraphics[width=\linewidth]{graphics/picture} - -\DocInput{cloze.dtx} - -\subsection{The file cloze.lua} - -\inputminted{lua}{cloze.lua} - -\pagebreak -\PrintChanges -\pagebreak -\PrintIndex -\end{document} -% -% \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). -% } -% -% \DoNotIndex{\newcommand,\newenvironment,\def,\directlua} -% -% \StopEventually{} -% \pagebreak -% \section{Implementation} -% -% \iffalse -%<*package> -% \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}} -% -% 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{macrocode} -\directlua{ - cloze = require('cloze') -} -% \end{macrocode} -% -% \begin{macrocode} -\newif\ifclozeshow\clozeshowtrue -% \end{macrocode} -% -% \subsubsection{Internal macros} -% -% \begin{macro}{\cloze@set@to@global} -% Set the Lua variable |registry.is_global| to |true|. All options -% are then stored in the variable |registry.global_options|. -% \begin{macrocode} -\def\cloze@set@to@global{% - \directlua{cloze.set_is_global(true)}% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\cloze@set@to@local} -% 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\cloze@set@to@local{% - \directlua{ - cloze.unset_local_options() - cloze.set_is_global(false) - }% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\cloze@set@option} -% \cmd{\cloze@set@option} is a wrapper for the Lua function -% |registry.set_option|. \cmd{\cloze@set@option}\oarg{key}\marg{value} -% sets a key \meta{key} to the value \meta{value}. -% \begin{macrocode} -\def\cloze@set@option[#1]#2{% - \directlua{cloze.set_option('#1', '#2')}% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\cloze@color} -% 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 |\cloze@color{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\cloze@color#1{\csname\string\color@#1\endcsname} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\cloze@set@local@options} -% 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\cloze@set@local@options#1{% - \cloze@set@to@local% - \kvsetkeys{CLZ}{#1}% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\cloze@start@marker} -% At the begining |\cloze@start@marker| registers the required Lua -% callbacks. Then it inserts a whatsit marker which marks the begin of a -% gap. -% \begin{macrocode} -\def\cloze@start@marker#1{% - \strut\directlua{ - cloze.register('#1') - cloze.marker('#1', 'start') - }% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\cloze@stop@marker} -% \cmd{\cloze@stop@marker} inserts a whatsit marker that marks the end -% of gap. -% \begin{macrocode} -\def\cloze@stop@marker#1{% - \strut\directlua{ - cloze.marker('#1', 'stop') - }% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\cloze@margin} -% \cmd{\cloze@margin} surrounds a text in a gap with two |kerns|. -% \begin{macrocode} -\def\cloze@margin#1{% - \directlua{cloze.margin()}% - #1% - \directlua{cloze.margin()}% -} -% \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} -\cloze@set@to@global -% \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 \secref{sec:option-align} how to use -% the option |align|. |align| affects only the command \cmd{\clozefix} -% \secref{sec:command-clozefix}. -% -% \begin{macrocode} -\DeclareStringOption{align} -\define@key{CLZ}{align}[]{\cloze@set@option[align]{#1}} -% \end{macrocode} -% -% \paragraph{\tt{boxheight}} -% -% \noindent Please read the section \secref{sec:sec:command-clozebox} -% how to use the option |boxheight|. |boxheight| affects only the -% environment \cmd{clozebox}. -% \secref{sec:command-clozefix}. -% -% \begin{macrocode} -\DeclareStringOption{boxheight} -\define@key{CLZ}{boxheight}[]{\cloze@set@option[boxheight]{#1}} -% \end{macrocode} -% -% \paragraph{\tt{boxwidth}} -% -% \noindent Please read the section \secref{sec:sec:command-clozebox} -% how to use the option |boxwidth|. |boxwidth| affects only the -% environment \cmd{clozebox}. -% \secref{sec:command-clozefix}. -% -% \begin{macrocode} -\DeclareStringOption{boxwidth} -\define@key{CLZ}{boxwidth}[]{\cloze@set@option[boxwidth]{#1}} -% \end{macrocode} -% -% \paragraph{\tt{distance}} -% -% \noindent Please read the section \secref{sec:option-distance} how to -% use the option |distance|. -% -% \begin{macrocode} -\DeclareStringOption{distance} -\define@key{CLZ}{distance}[]{\cloze@set@option[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 \secref{sec:option-hide} how to use the option -% |hide|. -% -% \begin{macrocode} -\DeclareVoidOption{hide}{% - \clozeshowfalse% - \cloze@set@option[hide]{true}% - \cloze@set@option[show]{false}% -} -% \end{macrocode} -% -% \paragraph{\tt{linecolor}} -% -% \noindent Please read the section \secref{sec:option-linecolor} how to -% use the option |linecolor|. -% -% \begin{macrocode} -\DeclareStringOption{linecolor} -\define@key{CLZ}{linecolor}[]{% - \cloze@set@option[linecolor]{\cloze@color{#1}}% - \cloze@set@option[linecolor_name]{#1}% -} -% \end{macrocode} -% -% \paragraph{\tt{margin}} -% -% \noindent Please read the section \secref{sec:option-margin} how to -% use the option |margin|. -% -% \begin{macrocode} -\DeclareStringOption{margin} -\define@key{CLZ}{margin}[]{\cloze@set@option[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 \secref{sec:option-show} how to use the option -% |show|. -% -% \begin{macrocode} -\DeclareVoidOption{show}{% - \clozeshowtrue% - \cloze@set@option[show]{true}% - \cloze@set@option[hide]{false}% -} -% \end{macrocode} -% -% \paragraph{\tt{spacing}} -% -% \noindent Please read the section \secref{sec:option-spacing} how to -% use the option |spacing|. -% -% \begin{macrocode} -\DeclareStringOption{spacing} -\define@key{CLZ}{spacing}[]{\cloze@set@option[spacing]{#1}} -% \end{macrocode} -% -% \paragraph{\tt{textcolor}} -% -% \noindent Please read the section \secref{sec:option-textcolor} how to -% use the option |textcolor|. -% -% \begin{macrocode} -\DeclareStringOption{textcolor} -\define@key{CLZ}{textcolor}[]{% - \cloze@set@option[textcolor]{\cloze@color{#1}}% - \cloze@set@option[textcolor_name]{#1}% -} -% \end{macrocode} -% -% \paragraph{\tt{thickness}} -% -% \noindent Please read the section \secref{sec:option-thickness} how to -% use the option |thickness|. -% -% \begin{macrocode} -\DeclareStringOption{thickness} -\define@key{CLZ}{thickness}[]{\cloze@set@option[thickness]{#1}} -% \end{macrocode} -% -% \paragraph{\tt{width}} -% -% \noindent Please read the section \secref{sec:option-width} how to use -% the option |width|. |width| affects only the command \cmd{\clozefix} -% \secref{sec:command-clozefix}. -% -% \begin{macrocode} -\DeclareStringOption{width} -\define@key{CLZ}{width}[]{\cloze@set@option[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 \secref{sec:command-clozeset}. -% \begin{macrocode} -\newcommand{\clozeset}[1]{% - \cloze@set@to@global% - \kvsetkeys{CLZ}{#1}% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\clozereset} -% The usage of the command \cmd{\clozereset} is described in detail in -% section \secref{sec:command-clozereset}. -% \begin{macrocode} -\newcommand{\clozereset}{% - \directlua{cloze.reset()} -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\clozeshow} -% The usage of the command \cmd{\clozeshow} is described in detail in -% section \secref{sec:command-clozeshow}. -% \begin{macrocode} -\newcommand{\clozeshow}{% - \clozeset{show} -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\clozehide} -% The usage of the command \cmd{\clozehide} is described in detail in -% section \secref{sec:command-clozehide}. -% \begin{macrocode} -\newcommand{\clozehide}{% - \clozeset{hide} -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\clozefont} -% The usage of the command \cmd{\clozefont} is described in detail in -% section \secref{sec:command-clozefont}. -% \begin{macrocode} -\newcommand{\clozefont}{\itshape} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\clozesetfont} -% The usage of the command \cmd{\clozesetfont} is described in detail in -% section \secref{sec:command-clozesetfont}. -% \begin{macrocode} -\newcommand{\clozesetfont}[1]{% - \renewcommand{\clozefont}[1]{% - #1% - }% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\cloze} -% The usage of the command \cmd{\cloze} is described in detail in -% section \secref{sec:command-cloze}. -% \begin{macrocode} -\newcommand{\cloze}[2][]{% - \cloze@set@local@options{#1}% - \cloze@start@marker{basic}% - {% - \clozefont\relax% - \cloze@margin{#2}% - }% - \cloze@stop@marker{basic}% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\clozefix} -% The usage of the command \cmd{\clozefix} is described in detail in -% section \secref{sec:command-clozefix}. -% \begin{macrocode} -\newcommand{\clozefix}[2][]{% - \cloze@set@local@options{#1}% - \cloze@start@marker{fix}% - {% - \clozefont\relax% - \cloze@margin{#2}% - }% - \cloze@stop@marker{fix}% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\clozenol} -% The usage of the command \cmd{\clozenol} is described in detail in -% section \secref{sec:command-clozenol}. -% TODO: Realize this macro with lua code, without ugly |\color{white}|. -% command. -% \begin{macrocode} -\newcommand{\clozenol}[2][]{% - {% - \cloze@set@local@options{#1}% - \clozefont\relax% - \ifclozeshow% - \color{\directlua{tex.print(cloze.get_value('textcolor_name'))}}% - \else% - \color{white}% - \fi% - #2% - }% -} -% \end{macrocode} -% \end{macro} -% -% \begin{environment}{clozepar} -% The usage of the environment |clozepar| is described in detail in -% section \secref{sec:command-clozepar}. -% \begin{macrocode} -\newenvironment{clozepar}[1][]% -{% - \par% - \cloze@set@local@options{#1}% - \cloze@start@marker{par}% - \clozefont\relax% -}% -{% - \cloze@stop@marker{par}% - \par% - \directlua{cloze.unregister('par')}% -} -% \end{macrocode} -% \end{environment} -% -% \begin{macro}{\cloze@get@value} -% \begin{macrocode} -\newcommand{\cloze@get@value}[1]{% - \directlua{ - tex.print(cloze.get_value('#1')) - }% -} -% \end{macrocode} -% \end{macro} -% -% \begin{environment}{clozebox} -% The usage of the environment |clozebox| is described in detail in -% section \secref{sec:command-clozebox}. -% TODO: Realize this macro with lua code, without ugly |\color{white}| -% command. -% \begin{macrocode} -\newsavebox{\cloze@box} -\NewDocumentEnvironment{clozebox}{ s O{} +b}{% - \cloze@set@local@options{#2}% - \noindent% - \begin{lrbox}{\cloze@box}% - \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 - } - \clozefont\relax% - \ifclozeshow% - \color{\directlua{tex.print(cloze.get_value('textcolor_name'))}}#3% - \else% - \color{white}#3% - \fi% - \end{minipage}% - \end{lrbox}% - \IfBooleanTF{#1}% - {\usebox{\cloze@box}}% - {\fbox{\usebox{\cloze@box}}}% -}{} -% \end{macrocode} -% \end{environment} -% -% \begin{environment}{clozespace} -% The usage of the environment |clozespace| is described in detail in -% section \secref{sec:command-clozespace}. -% TODO: Realization without setspace package. -% \begin{macrocode} -\newenvironment{clozespace}[1][]% -{% - \cloze@set@local@options{#1}% - \begin{spacing}{\directlua{tex.print(cloze.get_value('spacing'))}}% -}{\end{spacing}} -% \end{macrocode} -% \end{environment} -% -% \begin{macro}{\clozefil} -% The usage of the command \cmd{\clozefil} is described in detail in -% section \secref{sec:command-clozefil}. -% \begin{macrocode} -\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}{\clozeline} -% The usage of the command \cmd{\clozeline} is described in detail in -% section \secref{sec:command-clozeline}. -% \begin{macrocode} -\newcommand{\clozeline}[1][]{% - \cloze@set@local@options{#1}% - \directlua{cloze.line()}% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\clozelinefil} -% The usage of the command \cmd{\clozelinefil} is described in detail in -% section \secref{sec:command-clozelinefil}. -% \begin{macrocode} -\newcommand{\clozelinefil}[1][]{% - \cloze@set@local@options{#1}% - \strut% - \directlua{cloze.linefil()}% - \strut% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\cloze@text@color} -% \begin{macrocode} -\newcommand{\cloze@text@color}[1]{% - \textcolor% - {\directlua{tex.print(cloze.get_value('textcolor_name'))}}% - {#1}% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\cloze@strike@line} -% \begin{macrocode} -\newcommand\cloze@strike@line{% - \bgroup% - \markoverwith{% - \cloze@text@color{% - \rule[0.5ex]{2pt}{1pt}% - }% - }% - \ULon% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\clozestrike} -% \begin{macrocode} -\newcommand{\clozestrike}[3][]{% - \cloze@set@local@options{#1}% - \ifclozeshow% - \stackengine% - {\Sstackgap}% \Sstackgap or \Lstackgap or \stackgap or stacklength - {\cloze@strike@line{#2}}% anchor - {\cloze@text@color{\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 -% -% \fi -% -% \Finale -\endinput diff --git a/Master/texmf-dist/source/lualatex/cloze/cloze.ins b/Master/texmf-dist/source/lualatex/cloze/cloze.ins deleted file mode 100644 index 75f4839276f..00000000000 --- a/Master/texmf-dist/source/lualatex/cloze/cloze.ins +++ /dev/null @@ -1,56 +0,0 @@ -% Copyright (C) 2015-2020 by Josef Friedrich -% ---------------------------------------------------------------------- -% 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 -% -% and version 1.3c or later is part of all distributions of LaTeX -% version 2008/05/05 or later. - - -\input docstrip.tex -\keepsilent - -\usedir{tex/lualatex/cloze} - -\askforoverwritefalse - -\preamble - -This is a generated file. - -Copyright (C) 2015-2020 by Josef Friedrich ----------------------------------------------------------------------- -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 - -and version 1.3c or later is part of all distributions of LaTeX -version 2008/05/05 or later. - -\endpreamble - -\generate{\file{cloze.sty}{\from{cloze.dtx}{package}}} - -\obeyspaces -\Msg{*************************************************************} -\Msg{* *} -\Msg{* To finish the installation you have to move the following *} -\Msg{* file into a directory searched by TeX: *} -\Msg{* *} -\Msg{* cloze.sty *} -\Msg{* *} -\Msg{* To produce the documentation run the file cloze.dtx *} -\Msg{* through LaTeX. *} -\Msg{* *} -\Msg{* Happy TeXing! *} -\Msg{* *} -\Msg{*************************************************************} - -\endbatchfile diff --git a/Master/texmf-dist/source/luatex/cloze/cloze.dtx b/Master/texmf-dist/source/luatex/cloze/cloze.dtx new file mode 100644 index 00000000000..1c18af683bb --- /dev/null +++ b/Master/texmf-dist/source/luatex/cloze/cloze.dtx @@ -0,0 +1,907 @@ +% \iffalse meta-comment +% +% Copyright (C) 2015-2020 by Josef Friedrich +% ---------------------------------------------------------------------- +% 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} +% +%\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%\ProvidesPackage{cloze} +%<*latex> + [2020/06/60 v1.6 Package to typeset cloze worksheets or cloze tests] +% +% \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 +% +% \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 +% +% \fi +% +% \Finale +\endinput diff --git a/Master/texmf-dist/source/luatex/cloze/cloze.ins b/Master/texmf-dist/source/luatex/cloze/cloze.ins new file mode 100644 index 00000000000..9ed14f61991 --- /dev/null +++ b/Master/texmf-dist/source/luatex/cloze/cloze.ins @@ -0,0 +1,57 @@ +% Copyright (C) 2015-2020 by Josef Friedrich +% ---------------------------------------------------------------------- +% 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 +% +% and version 1.3c or later is part of all distributions of LaTeX +% version 2008/05/05 or later. + + +\input docstrip.tex +\keepsilent + +\usedir{tex/lualatex/cloze} + +\askforoverwritefalse + +\preamble + +This is a generated file. + +Copyright (C) 2015-2020 by Josef Friedrich +---------------------------------------------------------------------- +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 + +and version 1.3c or later is part of all distributions of LaTeX +version 2008/05/05 or later. + +\endpreamble + +\generate{\file{cloze.tex}{\from{cloze.dtx}{plaintex}}} +\generate{\file{cloze.sty}{\from{cloze.dtx}{latex}}} + +\obeyspaces +\Msg{*************************************************************} +\Msg{* *} +\Msg{* To finish the installation you have to move the following *} +\Msg{* file into a directory searched by TeX: *} +\Msg{* *} +\Msg{* cloze.sty *} +\Msg{* *} +\Msg{* To produce the documentation run the file cloze.dtx *} +\Msg{* through LaTeX. *} +\Msg{* *} +\Msg{* Happy TeXing! *} +\Msg{* *} +\Msg{*************************************************************} + +\endbatchfile diff --git a/Master/texmf-dist/tex/lualatex/cloze/cloze.sty b/Master/texmf-dist/tex/lualatex/cloze/cloze.sty deleted file mode 100644 index a7f604dbbc0..00000000000 --- a/Master/texmf-dist/tex/lualatex/cloze/cloze.sty +++ /dev/null @@ -1,273 +0,0 @@ -%% -%% This is file `cloze.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% cloze.dtx (with options: `package') -%% -%% This is a generated file. -%% -%% Copyright (C) 2015-2020 by Josef Friedrich -%% ---------------------------------------------------------------------- -%% 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 -%% -%% and version 1.3c or later is part of all distributions of LaTeX -%% version 2008/05/05 or later. -%% -\NeedsTeXFormat{LaTeX2e}[1999/12/01] -\ProvidesPackage{cloze} - [2020/05/27 v1.5 Package to typeset cloze worksheets or cloze tests] -\RequirePackage{fontspec} -\RequirePackage{luatexbase-mcb} -\RequirePackage{kvoptions} -\RequirePackage{setspace} -\RequirePackage{xcolor} -\RequirePackage{xparse} -\RequirePackage{stackengine} -\RequirePackage{ulem} -\normalem -\RequirePackage{transparent} -\directlua{ - cloze = require('cloze') -} -\newif\ifclozeshow\clozeshowtrue -\def\cloze@set@to@global{% - \directlua{cloze.set_is_global(true)}% -} -\def\cloze@set@to@local{% - \directlua{ - cloze.unset_local_options() - cloze.set_is_global(false) - }% -} -\def\cloze@set@option[#1]#2{% - \directlua{cloze.set_option('#1', '#2')}% -} -\def\cloze@color#1{\csname\string\color@#1\endcsname} -\def\cloze@set@local@options#1{% - \cloze@set@to@local% - \kvsetkeys{CLZ}{#1}% -} -\def\cloze@start@marker#1{% - \strut\directlua{ - cloze.register('#1') - cloze.marker('#1', 'start') - }% -} -\def\cloze@stop@marker#1{% - \strut\directlua{ - cloze.marker('#1', 'stop') - }% -} -\def\cloze@margin#1{% - \directlua{cloze.margin()}% - #1% - \directlua{cloze.margin()}% -} -\cloze@set@to@global -\SetupKeyvalOptions{ - family=CLZ, - prefix=CLZ@ -} -\DeclareStringOption{align} -\define@key{CLZ}{align}[]{\cloze@set@option[align]{#1}} -\DeclareStringOption{boxheight} -\define@key{CLZ}{boxheight}[]{\cloze@set@option[boxheight]{#1}} -\DeclareStringOption{boxwidth} -\define@key{CLZ}{boxwidth}[]{\cloze@set@option[boxwidth]{#1}} -\DeclareStringOption{distance} -\define@key{CLZ}{distance}[]{\cloze@set@option[distance]{#1}} -\DeclareVoidOption{hide}{% - \clozeshowfalse% - \cloze@set@option[hide]{true}% - \cloze@set@option[show]{false}% -} -\DeclareStringOption{linecolor} -\define@key{CLZ}{linecolor}[]{% - \cloze@set@option[linecolor]{\cloze@color{#1}}% - \cloze@set@option[linecolor_name]{#1}% -} -\DeclareStringOption{margin} -\define@key{CLZ}{margin}[]{\cloze@set@option[margin]{#1}} -\DeclareVoidOption{show}{% - \clozeshowtrue% - \cloze@set@option[show]{true}% - \cloze@set@option[hide]{false}% -} -\DeclareStringOption{spacing} -\define@key{CLZ}{spacing}[]{\cloze@set@option[spacing]{#1}} -\DeclareStringOption{textcolor} -\define@key{CLZ}{textcolor}[]{% - \cloze@set@option[textcolor]{\cloze@color{#1}}% - \cloze@set@option[textcolor_name]{#1}% -} -\DeclareStringOption{thickness} -\define@key{CLZ}{thickness}[]{\cloze@set@option[thickness]{#1}} -\DeclareStringOption{width} -\define@key{CLZ}{width}[]{\cloze@set@option[width]{#1}} -\ProcessKeyvalOptions{CLZ} -\newcommand{\clozeset}[1]{% - \cloze@set@to@global% - \kvsetkeys{CLZ}{#1}% -} -\newcommand{\clozereset}{% - \directlua{cloze.reset()} -} -\newcommand{\clozeshow}{% - \clozeset{show} -} -\newcommand{\clozehide}{% - \clozeset{hide} -} -\newcommand{\clozefont}{\itshape} -\newcommand{\clozesetfont}[1]{% - \renewcommand{\clozefont}[1]{% - #1% - }% -} -\newcommand{\cloze}[2][]{% - \cloze@set@local@options{#1}% - \cloze@start@marker{basic}% - {% - \clozefont\relax% - \cloze@margin{#2}% - }% - \cloze@stop@marker{basic}% -} -\newcommand{\clozefix}[2][]{% - \cloze@set@local@options{#1}% - \cloze@start@marker{fix}% - {% - \clozefont\relax% - \cloze@margin{#2}% - }% - \cloze@stop@marker{fix}% -} -\newcommand{\clozenol}[2][]{% - {% - \cloze@set@local@options{#1}% - \clozefont\relax% - \ifclozeshow% - \color{\directlua{tex.print(cloze.get_value('textcolor_name'))}}% - \else% - \color{white}% - \fi% - #2% - }% -} -\newenvironment{clozepar}[1][]% -{% - \par% - \cloze@set@local@options{#1}% - \cloze@start@marker{par}% - \clozefont\relax% -}% -{% - \cloze@stop@marker{par}% - \par% - \directlua{cloze.unregister('par')}% -} -\newcommand{\cloze@get@value}[1]{% - \directlua{ - tex.print(cloze.get_value('#1')) - }% -} -\newsavebox{\cloze@box} -\NewDocumentEnvironment{clozebox}{ s O{} +b}{% - \cloze@set@local@options{#2}% - \noindent% - \begin{lrbox}{\cloze@box}% - \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 - } - \clozefont\relax% - \ifclozeshow% - \color{\directlua{tex.print(cloze.get_value('textcolor_name'))}}#3% - \else% - \color{white}#3% - \fi% - \end{minipage}% - \end{lrbox}% - \IfBooleanTF{#1}% - {\usebox{\cloze@box}}% - {\fbox{\usebox{\cloze@box}}}% -}{} -\newenvironment{clozespace}[1][]% -{% - \cloze@set@local@options{#1}% - \begin{spacing}{\directlua{tex.print(cloze.get_value('spacing'))}}% -}{\end{spacing}} -\newcommand{\clozefil}[2][]{% - \cloze[#1]{#2}\clozelinefil[#1]% -} -\newcommand{\clozeextend}[1][1]{% - \directlua{ - local loop = #1 - for variable = 1, loop do - tex.print(' \string\\hspace{1em} \string\\strut') - end - } -} -\newcommand{\clozeline}[1][]{% - \cloze@set@local@options{#1}% - \directlua{cloze.line()}% -} -\newcommand{\clozelinefil}[1][]{% - \cloze@set@local@options{#1}% - \strut% - \directlua{cloze.linefil()}% - \strut% -} -\newcommand{\cloze@text@color}[1]{% - \textcolor% - {\directlua{tex.print(cloze.get_value('textcolor_name'))}}% - {#1}% -} -\newcommand\cloze@strike@line{% - \bgroup% - \markoverwith{% - \cloze@text@color{% - \rule[0.5ex]{2pt}{1pt}% - }% - }% - \ULon% -} -\newcommand{\clozestrike}[3][]{% - \cloze@set@local@options{#1}% - \ifclozeshow% - \stackengine% - {\Sstackgap}% \Sstackgap or \Lstackgap or \stackgap or stacklength - {\cloze@strike@line{#2}}% anchor - {\cloze@text@color{\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% -} -\endinput -%% -%% End of file `cloze.sty'. diff --git a/Master/texmf-dist/tex/luatex/cloze/cloze.sty b/Master/texmf-dist/tex/luatex/cloze/cloze.sty new file mode 100644 index 00000000000..4c67c66a55a --- /dev/null +++ b/Master/texmf-dist/tex/luatex/cloze/cloze.sty @@ -0,0 +1,220 @@ +%% +%% This is file `cloze.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% cloze.dtx (with options: `latex') +%% +%% This is a generated file. +%% +%% Copyright (C) 2015-2020 by Josef Friedrich +%% ---------------------------------------------------------------------- +%% 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 +%% +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2008/05/05 or later. +%% +\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\ProvidesPackage{cloze} + [2020/06/60 v1.6 Package to typeset cloze worksheets or cloze tests] +\input{cloze.tex} +\RequirePackage{fontspec} +\RequirePackage{luatexbase-mcb} +\RequirePackage{kvoptions} +\RequirePackage{setspace} +\RequirePackage{xcolor} +\RequirePackage{xparse} +\RequirePackage{stackengine} +\RequirePackage{ulem} +\normalem +\RequirePackage{transparent} +\let\clozesetoption=\undefined +\newcommand{\clozesetoption}[2]{% + \directlua{cloze.set_option('#1', '#2')}% +} +\def\ClozeSetLocalOptions#1{% + \ClozeSetToLocal% + \kvsetkeys{CLZ}{#1}% +} +\ClozeSetToGlobal +\SetupKeyvalOptions{ + family=CLZ, + prefix=CLZ@ +} +\DeclareStringOption{align} +\define@key{CLZ}{align}[]{\clozesetoption{align}{#1}} +\DeclareStringOption{boxheight} +\define@key{CLZ}{boxheight}[]{\clozesetoption{boxheight}{#1}} +\DeclareStringOption{boxwidth} +\define@key{CLZ}{boxwidth}[]{\clozesetoption{boxwidth}{#1}} +\DeclareStringOption{distance} +\define@key{CLZ}{distance}[]{\clozesetoption{distance}{#1}} +\DeclareVoidOption{hide}{% + \clozeshowfalse% + \clozesetoption{hide}{true}% + \clozesetoption{show}{false}% +} +\DeclareStringOption{linecolor} +\define@key{CLZ}{linecolor}[]{% + \clozesetoption{linecolor}{\ClozeColor{#1}}% + \clozesetoption{linecolor_name}{#1}% +} +\DeclareStringOption{margin} +\define@key{CLZ}{margin}[]{\clozesetoption{margin}{#1}} +\DeclareVoidOption{show}{% + \clozeshowtrue% + \clozesetoption{show}{true}% + \clozesetoption{hide}{false}% +} +\DeclareStringOption{spacing} +\define@key{CLZ}{spacing}[]{\clozesetoption{spacing}{#1}} +\DeclareStringOption{textcolor} +\define@key{CLZ}{textcolor}[]{% + \clozesetoption{textcolor}{\ClozeColor{#1}}% + \clozesetoption{textcolor_name}{#1}% +} +\DeclareStringOption{thickness} +\define@key{CLZ}{thickness}[]{\clozesetoption{thickness}{#1}} +\DeclareStringOption{width} +\define@key{CLZ}{width}[]{\clozesetoption{width}{#1}} +\ProcessKeyvalOptions{CLZ} +\newcommand{\clozeset}[1]{% + \ClozeSetToGlobal% + \kvsetkeys{CLZ}{#1}% +} +\let\clozeshow=\undefined +\newcommand{\clozeshow}{% + \clozeset{show} +} +\let\clozehide=\undefined +\newcommand{\clozehide}{% + \clozeset{hide} +} +\let\clozeplain=\cloze +\let\cloze=\undefined +\newcommand{\cloze}[2][]{% + \ClozeSetLocalOptions{#1}% + \clozeplain{#2}% +} +\let\clozefixplain=\clozefix +\let\clozefix=\undefined +\newcommand{\clozefix}[2][]{% + \ClozeSetLocalOptions{#1}% + \clozefixplain{#2}% +} +\let\clozenolplain=\clozenol +\let\clozenol=\undefined +\newcommand{\clozenol}[2][]{% + \ClozeSetLocalOptions{#1}% + \clozenolplain{#2}% +} +\newenvironment{clozepar}[1][]% +{% + \par% + \ClozeSetLocalOptions{#1}% + \ClozeStartMarker{par}% + \clozefont\relax% +}% +{% + \ClozeStopMarker{par}% + \par% + \directlua{cloze.unregister('par')}% +} +\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}}}% +}{} +\newenvironment{clozespace}[1][]% +{% + \ClozeSetLocalOptions{#1}% + \begin{spacing}{\directlua{tex.print(cloze.get_value('spacing'))}}% +}{\end{spacing}} +\let\clozelineplain=\clozeline +\let\clozeline=\undefined +\newcommand{\clozeline}[1][]{% + \ClozeSetLocalOptions{#1}% + \clozelineplain% +} +\let\clozelinefilplain=\clozelinefil +\let\clozelinefil=\undefined +\newcommand{\clozelinefil}[1][]{% + \ClozeSetLocalOptions{#1}% + \clozelinefilplain% +} +\let\clozefil=\undefined +\newcommand{\clozefil}[2][]{% + \cloze[#1]{#2}\clozelinefil[#1]% +} +\newcommand{\clozeextend}[1][1]{% + \directlua{ + local loop = #1 + for variable = 1, loop do + tex.print(' \string\\hspace{1em} \string\\strut') + end + } +} +\newcommand{\ClozeTextColor}[1]{% + \textcolor% + {\directlua{tex.print(cloze.get_value('textcolor_name'))}}% + {#1}% +} +\newcommand\ClozeStrikeLine{% + \bgroup% + \markoverwith{% + \ClozeTextColor{% + \rule[0.5ex]{2pt}{1pt}% + }% + }% + \ULon% +} +\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% +} +\endinput +%% +%% End of file `cloze.sty'. -- cgit v1.2.3