From d79a721c345c9a2ced6c0640e88c10cc3378c1f0 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Wed, 1 Jul 2020 03:03:30 +0000 Subject: CTAN sync 202007010303 --- macros/luatex/latex/cloze/README.md | 101 -- macros/luatex/latex/cloze/cloze.dtx | 1929 ----------------------------------- macros/luatex/latex/cloze/cloze.ins | 56 - macros/luatex/latex/cloze/cloze.lua | 1002 ------------------ macros/luatex/latex/cloze/cloze.pdf | Bin 318609 -> 0 bytes 5 files changed, 3088 deletions(-) delete mode 100644 macros/luatex/latex/cloze/README.md delete mode 100644 macros/luatex/latex/cloze/cloze.dtx delete mode 100644 macros/luatex/latex/cloze/cloze.ins delete mode 100644 macros/luatex/latex/cloze/cloze.lua delete mode 100644 macros/luatex/latex/cloze/cloze.pdf (limited to 'macros/luatex/latex') diff --git a/macros/luatex/latex/cloze/README.md b/macros/luatex/latex/cloze/README.md deleted file mode 100644 index 04dc316ef3..0000000000 --- a/macros/luatex/latex/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/macros/luatex/latex/cloze/cloze.dtx b/macros/luatex/latex/cloze/cloze.dtx deleted file mode 100644 index f2ec1be8c5..0000000000 --- a/macros/luatex/latex/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/macros/luatex/latex/cloze/cloze.ins b/macros/luatex/latex/cloze/cloze.ins deleted file mode 100644 index 75f4839276..0000000000 --- a/macros/luatex/latex/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/macros/luatex/latex/cloze/cloze.lua b/macros/luatex/latex/cloze/cloze.lua deleted file mode 100644 index b9490354a5..0000000000 --- a/macros/luatex/latex/cloze/cloze.lua +++ /dev/null @@ -1,1002 +0,0 @@ ---- Cloze uses [LDoc](https://github.com/stevedonovan/ldoc) for the --- source code documentation. The supported tags are described on in --- the [wiki](https://github.com/stevedonovan/LDoc/wiki). --- ---

Naming conventions

--- --- * _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`. --- --- @module cloze - --- __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', - comment = 'cloze', - author = 'Josef Friedrich, R.-M. Huber', - copyright = 'Josef Friedrich, R.-M. Huber', - license = 'The LaTeX Project Public License Version 1.3c 2008-05-04' -} - ---- `nodex` is a abbreviation for __node eXtended__. -local nodex = {} - ---- All values and functions, which are related to the option management, --- are stored in a table called `registry`. -local registry = {} - ---- I didn't know what value I should take as `user_id`. Therefore I --- took my birthday and transformed it to a large number. -registry.user_id = 3121978 -registry.storage = {} -registry.defaults = { - ['align'] = 'l', - ['boxheight'] = false, - ['boxwidth'] = '\\linewidth', - ['distance'] = '1.5pt', - ['hide'] = false, - ['linecolor'] = '0 0 0 rg 0 0 0 RG', -- black - ['linecolor_name'] = 'black', - ['margin'] = '3pt', - ['resetcolor'] = '0 0 0 rg 0 0 0 RG', -- black - ['resetcolor_name'] = 'black', - ['show_text'] = true, - ['show'] = true, - ['spacing'] = '1.6', - ['textcolor'] = '0 0 1 rg 0 0 1 RG', -- blue - ['textcolor_name'] = 'blue', -- blue - ['thickness'] = '0.4pt', - ['width'] = '2cm', -} -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 = {} -base.is_registered = {} - ---- Node precessing (nodex) --- @section nodex - --- All functions in this section are stored in a table called `nodex`. --- `nodex` is a abbreviation for __node eXtended__. The `nodex` table --- bundles all functions, which extend the built-in `node` library. - --- __Color handling (color)__ - --- __create_colorstack__ --- Create a whatsit node of the subtype `pdf_colorstack`. `data` is a PDF --- colorstack string like `0 0 0 rg 0 0 0 RG`. -function nodex.create_colorstack(data) - if not data then - data = '0 0 0 rg 0 0 0 RG' -- black - end - local whatsit = node.new('whatsit', 'pdf_colorstack') - whatsit.stack = 0 - whatsit.data = data - return whatsit -end - ---- --- `nodex.create_color()` is a wrapper for the function --- `nodex.create_colorstack()`. It queries the current values of the --- options `linecolor` and `textcolor`. The argument `option` accepts the --- strings `line`, `text` and `reset`. -function nodex.create_color(option) - local data - if option == 'line' then - data = registry.get_value('linecolor') - elseif option == 'text' then - data = registry.get_value('textcolor') - elseif option == 'reset' then - data = nil - else - data = nil - end - return nodex.create_colorstack(data) -end - --- __Line handling (line)__ - ---- Create a rule node, which is used as a line for the cloze texts. The --- `depth` and the `height` of the rule are calculated form the options --- `thickness` and `distance`. The argument `width` must have the length --- unit __scaled points__. -function nodex.create_line(width) - local rule = node.new(node.id('rule')) - local thickness = tex.sp(registry.get_value('thickness')) - local distance = tex.sp(registry.get_value('distance')) - rule.depth = distance + thickness - rule.height = - distance - rule.width = width - return rule -end - ---- Insert a `list` of nodes after or before the `current`. The `head` --- argument is optional. In some edge cases it is unfortately necessary. --- if `head` is omitted the `current` node is used. The argument --- `position` can take the values `'after'` or `'before'`. -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 - if position == 'after' then - head_node, current = node.insert_after(head_node, current, insert) - elseif position == 'before' then - head_node, current = node.insert_before(head_node, current, insert) - end - end - return current -end - ---- Enclose a rule node (cloze line) with two PDF colorstack whatsits. --- The first colorstack node dyes the line, the seccond resets the --- color. --- --- __Node list__ --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
`n.color_line``whatsit``pdf_colorstack`Line color
`n.line``rule``width`
`n.color_reset``whatsit``pdf_colorstack`Reset color
-function nodex.insert_line(current, width) - return nodex.insert_list( - 'after', - current, - { - nodex.create_color('line'), - nodex.create_line(width), - nodex.create_color('reset') - } - ) -end - ---- This function enclozes a rule node with color nodes as it the function --- `nodex.insert_line` does. In contrast to `nodex.insert_line` the three --- nodes are appended to \TeX’s ‘current list’. They are not inserted in --- a node list, which is accessed by a Lua callback. --- --- __Node list__ --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
-`whatsit``pdf_colorstack`Line color
-`rule``width`
-`whatsit``pdf_colorstack`Reset color
-function nodex.write_line() - node.write(nodex.create_color('line')) - node.write(nodex.create_line(tex.sp(registry.get_value('width')))) - node.write(nodex.create_color('reset')) -end - --- __Handling of extendable lines (linefil)__ - ---- This function creates a line which stretchs indefinitely in the --- horizontal direction. -function nodex.create_linefil() - local glue = node.new('glue') - glue.subtype = 100 - glue.stretch = 65536 - glue.stretch_order = 3 - local rule = nodex.create_line(0) - rule.dir = 'TLT' - glue.leader = rule - return glue -end - ---- The function `nodex.write_linefil` surrounds a indefinitely strechable --- line with color whatsits and puts it to \TeX’s ‘current (node) list’. -function nodex.write_linefil() - node.write(nodex.create_color('line')) - node.write(nodex.create_linefil()) - node.write(nodex.create_color('reset')) -end - --- __Kern handling (kern)__ - ---- This function creates a kern node with a given width. The argument --- `width` had to be specified in scaled points. -local function create_kern_node(width) - local kern_node = node.new(node.id('kern')) - kern_node.kern = width - return kern_node -end - ---- Add at the beginning of each `hlist` node list a strut (a invisible --- character). --- --- Now we can add line, color etc. nodes after the first node of a hlist --- not before - after is much more easier. --- --- @tparam node hlist_node --- --- @treturn node hlist_node --- @treturn node strut_node --- @treturn node head_node -local function insert_strut_into_hlist(hlist_node) - local 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 -end - ---- Write kern nodes to the current node list. This kern nodes can be used --- to build a margin. -function nodex.write_margin() - local kern = create_kern_node(tex.sp(registry.get_value('margin'))) - node.write(kern) -end - ---- Search for a `hlist` (subtype `line`). --- --- Insert 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. -local function search_hlist(head_node) - while head_node do - if head_node.id == node.id('hlist') and head_node.subtype == 1 then - return insert_strut_into_hlist(head_node) - end - head_node = head_node.next - end - return false -end - ---- Option handling. --- --- The table `registry` bundels functions that deal with option handling. --- ---

Marker processing (marker)

--- --- A marker is a whatsit node of the subtype `user_defined`. A marker has --- two purposes: --- --- * Mark the begin and the end of a gap. --- * Store a index number, that points to a Lua table, which holds --- some additional data like the local options. --- @section registry - ---- We create a user defined whatsit node that can store a number (type --- = 100). --- --- In order to distinguish this node from other user defined whatsit --- nodes we set the `user_id` to a large number. We call this whatsit --- node a marker. The argument `index` is a number, which is associated --- to values in the `registry.storage` table. -function registry.create_marker(index) - local marker = node.new('whatsit','user_defined') - marker.type = 100 -- number - marker.user_id = registry.user_id - marker.value = index - return marker -end - ---- 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 --- to `start` or to `stop`. -function registry.write_marker(mode, position) - local index = registry.set_storage(mode, position) - local marker = registry.create_marker(index) - node.write(marker) -end - ---- This functions checks if the given node `item` is a marker. -function registry.is_marker(item) - if item.id == node.id('whatsit') - and item.subtype == node.subtype('user_defined') - and item.user_id == registry.user_id then - return true - else - return false - end -end - ---- This functions tests, whether the given node `item` is a marker. --- --- The argument `item` is a node. The argument `mode` accepts the string --- values `basic`, `fix` and `par`. The argument `position` is either --- set to `start` or to `stop`. -function registry.check_marker(item, mode, position) - local data = registry.get_marker_data(item) - if data and data.mode == mode and data.position == position then - return true - else - return false - end -end - ---- `registry.get_marker` returns the given marker. --- --- The argument `item` is a node. The argument `mode` accepts the string --- values `basic`, `fix` and `par`. The argument `position` is either --- set to `start` or to `stop`. -function registry.get_marker(item, mode, position) - local out - if registry.check_marker(item, mode, position) then - out = item - else - out = false - end - if out and position == 'start' then - registry.get_marker_values(item) - end - return out -end - ---- `registry.get_marker_data` tests whether the node `item` is a --- marker. --- --- The argument `item` is a node of unspecified type. -function registry.get_marker_data(item) - if item.id == node.id('whatsit') - and item.subtype == node.subtype('user_defined') - and item.user_id == registry.user_id then - return registry.get_storage(item.value) - else - return false - end -end - ---- First this function saves the associatied values of a marker to the --- local options table. Second it returns this values. The argument --- `marker` is a whatsit node. -function registry.get_marker_values(marker) - local data = registry.get_marker_data(marker) - registry.local_options = data.values - return data.values -end - ---- This function removes a given whatsit marker. --- --- It only deletes a node, if a marker is given. -function registry.remove_marker(marker) - if registry.is_marker(marker) then node.remove(marker, marker) end -end - --- __Storage functions (storage)__ - ---- `registry.index` is a counter. The functions `registry.get_index()` --- increases the counter by one and then returns it. -function registry.get_index() - if not registry.index then - registry.index = 0 - end - registry.index = registry.index + 1 - return registry.index -end - ---- `registry.set_storage()` stores the local options in the Lua table --- `registry.storage`. --- --- It returns a numeric index number. This index number is the key, --- where the local options in the Lua table are stored. The argument --- `mode` accepts the string values `basic`, `fix` and `par`. -function registry.set_storage(mode, position) - local index = registry.get_index() - local data = { - ['mode'] = mode, - ['position'] = position - } - data.values = registry.local_options - registry.storage[index] = data - return index -end - ---- The function `registry.get_storage()` retrieves values which belong --- to a whatsit marker. --- --- The argument `index` is a numeric value. -function registry.get_storage(index) - return registry.storage[index] -end - --- __Option processing (option)__ - ---- This function stores a value `value` and his associated key `key` --- either to the global (`registry.global_options`) or to the local --- (`registry.local_options`) option table. --- --- The global boolean variable `registry.local_options` controls in --- which table the values are stored. -function registry.set_option(key, value) - if value == '' or value == '\\color@ ' then - return false - end - if registry.is_global == true then - registry.global_options[key] = value - else - registry.local_options[key] = value - end -end - ---- `registry.set_is_global()` sets the variable `registry.is_global` to --- the value `value`. It is intended, that the variable takes boolean --- values. -function registry.set_is_global(value) - registry.is_global = value -end - ---- This function unsets the local options. -function registry.unset_local_options() - registry.local_options = {} -end - ---- `registry.unset_global_options` empties the global options storage. -function registry.unset_global_options() - registry.global_options = {} -end - ---- Retrieve a value from a given key. First search for the value in the --- local options, then in the global options. If both option storages are --- empty, the default value will be returned. -function registry.get_value(key) - if registry.has_value(registry.local_options[key]) then - return registry.local_options[key] - end - if registry.has_value(registry.global_options[key]) then - return registry.global_options[key] - end - return registry.defaults[key] -end - - ---- The function `registry.get_value_show()` returns the boolean value --- `true` if the option `show` is true. In contrast to the function --- `registry.get_value()` it converts the string value `true' to a --- boolean value. -function registry.get_value_show() - if - registry.get_value('show') == true - or - registry.get_value('show') == 'true' - then - return true - else - return false - end -end - ---- This function tests whether the value `value` is not empty and has a --- value. -function registry.has_value(value) - if value == nil or value == '' or value == '\\color@ ' then - return false - else - return true - end -end - ---- `registry.get_defaults(option)` returns a the default value of the --- given option. -function registry.get_defaults(option) - return registry.defaults[option] -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. --- --- @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. --- --- 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 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 - 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) - 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) - else - cloze.basic_search_start(head_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 - ---- 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 - end - return l.width, l.kern_start, l.kern_stop -end - ---- The function `cloze.fix_make` generates a gap of fixed width. --- --- __Node lists__ --- --- __Show text:__ --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
`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`
--- --- 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 - 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) - 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 - end - 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 -end - ---- The corresponding LaTeX environment to this lua function is --- `clozepar`. --- --- __Node lists__ --- --- __Show text:__ --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
`n.strut``kern`width = 0
`n.line``rule``l.width` (Width from hlist)
`n.kern``kern``-l.width`
`n.color_text``whatsit``pdf_colorstack`Text color
`glyphs`Text to show
`n.tail``glyph`Last glyph in hlist
`n.color_reset``whatsit``pdf_colorstack`Reset color
--- --- __Hide text:__ --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
`n.strut``kern`width = 0
`n.line``rule``l.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 - 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) - if registry.get_value_show() then - nodex.insert_list( - 'after', - n.line, - { - create_kern_node(-l.width), - nodex.create_color('text') - } - ) - nodex.insert_list( - 'after', - node.tail(head_node), - {nodex.create_color('reset')} - ) - else - n.line.next = nil - end - end - return head_node -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. --- --- `cloze.par` and `cloze.basic` are registered to the callback --- `post_linebreak_filter` and `cloze.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( - 'post_linebreak_filter', - cloze.par, - mode - ) - return true - end - if not base.is_registered[mode] then - if mode == 'basic' then - luatexbase.add_to_callback( - 'post_linebreak_filter', - cloze.basic, - mode - ) - luatexbase.add_to_callback( - 'pre_output_filter', - cloze.basic, - mode - ) - elseif mode == 'fix' then - luatexbase.add_to_callback( - 'pre_linebreak_filter', - cloze.fix, - mode - ) - else - return false - end - base.is_registered[mode] = true - end -end - ---- `base.unregister(mode)` deletes the registered functions from the --- Lua callbacks. --- --- @tparam string mode The argument `mode` accepts the string values --- `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) - elseif mode == 'fix' then - luatexbase.remove_from_callback('pre_linebreak_filter', mode) - else - luatexbase.remove_from_callback('post_linebreak_filter', mode) - end -end - --- Publish some functions to the `cloze.sty` file. -base.linefil = nodex.write_linefil -base.line = nodex.write_line -base.margin = nodex.write_margin -base.set_option = registry.set_option -base.set_is_global = registry.set_is_global -base.unset_local_options = registry.unset_local_options -base.reset = registry.unset_global_options -base.get_defaults = registry.get_defaults -base.get_value = registry.get_value -base.marker = registry.write_marker - -return base diff --git a/macros/luatex/latex/cloze/cloze.pdf b/macros/luatex/latex/cloze/cloze.pdf deleted file mode 100644 index 8f9b26bf23..0000000000 Binary files a/macros/luatex/latex/cloze/cloze.pdf and /dev/null differ -- cgit v1.2.3