From e1b70cd3906c3b92e231eb8001f1a0c0eb2053c1 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Wed, 16 Feb 2022 03:00:44 +0000 Subject: CTAN sync 202202160300 --- macros/luatex/generic/lua-widow-control/README.md | 2 +- .../lua-widow-control/lua-widow-control.lua | 46 ++++++++++++++------- .../lua-widow-control/lua-widow-control.pdf | Bin 318979 -> 323185 bytes .../lua-widow-control/lua-widow-control.sty | 21 ++++++++-- .../lua-widow-control/lua-widow-control.tex | 9 +++- .../lua-widow-control/lwc-documentation.tex | 2 +- .../generic/lua-widow-control/lwc-sample.tex | 2 + .../lua-widow-control/t-lua-widow-control.mkxl | 4 +- 8 files changed, 61 insertions(+), 25 deletions(-) (limited to 'macros/luatex/generic') diff --git a/macros/luatex/generic/lua-widow-control/README.md b/macros/luatex/generic/lua-widow-control/README.md index 07c24e3c59..1f328f56a4 100644 --- a/macros/luatex/generic/lua-widow-control/README.md +++ b/macros/luatex/generic/lua-widow-control/README.md @@ -42,4 +42,4 @@ Lua-widow-control is licensed under the [_Mozilla Public License_, version 2.0]( Please note that a compiled document is absolutely **not** considered to be an "Executable Form" as defined by the MPL. The use of lua-widow-control in a document does not place **any** obligations on the document's author or distributors. The MPL and CC-BY-SA licenses **only** apply to you if you distribute the lua-widow-control source code or documentation. --- -_v1.1.4 (2022-02-04)_ +_v1.1.5 (2022-02-15)_ diff --git a/macros/luatex/generic/lua-widow-control/lua-widow-control.lua b/macros/luatex/generic/lua-widow-control/lua-widow-control.lua index 9a8b2efa78..9304bf9a4d 100644 --- a/macros/luatex/generic/lua-widow-control/lua-widow-control.lua +++ b/macros/luatex/generic/lua-widow-control/lua-widow-control.lua @@ -59,14 +59,16 @@ assert(lwc.context or luatexbase, [[ ]] if lwc.context then lwc.warning = logs.reporter("module", lwc.name) + lwc.info = logs.reporter("module", lwc.name) lwc.attribute = attributes.public(lwc.name) lwc.contrib_head = 'contributehead' -- For \LuaMetaTeX{} lwc.stretch_order = "stretchorder" + lwc.pagenum = function () return tex.count["realpageno"] end elseif lwc.plain or lwc.latex then luatexbase.provides_module { name = lwc.name, - date = "2022/02/04", --%%date - version = "1.1.4", --%%version + date = "2022/02/15", --%%date + version = "1.1.5", --%%version description = [[ This module provides a LuaTeX-based solution to prevent @@ -76,9 +78,11 @@ elseif lwc.plain or lwc.latex then ]], } lwc.warning = function(str) luatexbase.module_warning(lwc.name, str) end + lwc.info = function(str) luatexbase.module_info(lwc.name, str) end lwc.attribute = luatexbase.new_attribute(lwc.name) lwc.contrib_head = 'contrib_head' -- For \LuaTeX{} lwc.stretch_order = "stretch_order" + lwc.pagenum = function () return tex.count[0] end else -- uh oh error [[ Unsupported format. @@ -222,20 +226,28 @@ end --- --- Sometimes the node list can form a loop. Since there is no last element --- of a looped linked-list, the `last()` function will never terminate. This ---- function provides a "safe" version of the `last()` function that returns ---- `nil` if the list is circular. +--- function provides a "safe" version of the `last()` function that will break +--- the loop at the end if the list is circular. local function safe_last(head) local ids = {} + local prev while head.next do local id = node.is_node(head) -- Returns the internal node id if ids[id] then - lwc.warning("Circular node list detected!") - return nil + lwc.warning [[Circular node list detected! +This should never happen. I'll try and recover, but your output may be +corrupted. As a workaround, disable lua-widow-control for the +affected paragraph or change the page breaks in your document.]] + + prev.next = nil + return prev end ids[id] = true + head.prev = prev + prev = head head = head.next end @@ -265,6 +277,8 @@ function lwc.remove_widows(head) return head end + lwc.info("Widow/orphan detected. Attempting to remove.") + local head_save = head -- Save the start of the `head` linked-list --[[ @@ -296,22 +310,15 @@ function lwc.remove_widows(head) while head do -- Insert the start of the replacement paragraph if has_attribute(head, lwc.attribute, paragraph_index) then - local current = head - head.prev.next = target_node - - -- Abort if we've created a loop - if not safe_last(target_node) then - head.prev.next = current - lwc.warning("Widow/Orphan NOT removed!") - break - end + safe_last(target_node) -- Remove any loops + head.prev.next = target_node clear_flag = true end -- Insert the end of the replacement paragraph if has_attribute(head, lwc.attribute, -1 * paragraph_index) then - last(target_node).next = head.next + safe_last(target_node).next = head.next clear_flag = false end @@ -324,6 +331,13 @@ function lwc.remove_widows(head) last(head).prev.prev.next = nil -- Move the last line to the next page tex.lists[lwc.contrib_head] = last_line + lwc.info( + "Widow/orphan successfully removed at paragraph " + .. paragraph_index + .. " on page " + .. lwc.pagenum() + .. "." + ) end if clear_flag then diff --git a/macros/luatex/generic/lua-widow-control/lua-widow-control.pdf b/macros/luatex/generic/lua-widow-control/lua-widow-control.pdf index 5ee7f9995e..ecb0ae15e9 100644 Binary files a/macros/luatex/generic/lua-widow-control/lua-widow-control.pdf and b/macros/luatex/generic/lua-widow-control/lua-widow-control.pdf differ diff --git a/macros/luatex/generic/lua-widow-control/lua-widow-control.sty b/macros/luatex/generic/lua-widow-control/lua-widow-control.sty index 81dd969d8d..1be00709bc 100644 --- a/macros/luatex/generic/lua-widow-control/lua-widow-control.sty +++ b/macros/luatex/generic/lua-widow-control/lua-widow-control.sty @@ -5,7 +5,14 @@ \NeedsTeXFormat{LaTeX2e}[2015/01/01] % Formats built after 2015 include \LuaTeX{}Base \ProvidesPackage{lua-widow-control}% - [2022/02/04 v1.1.4] %%version %%date + [2022/02/15 v1.1.5] %%version %%date + +\ifdefined\directlua\else + \PackageError{lua-widow-control}{% + LuaTeX is required for this package.\MessageBreak + Make sure to compile with `lualatex'% + }{} +\fi \clubpenalty=1 \widowpenalty=1 @@ -22,7 +29,15 @@ % Here, we enable font expansion/contraction. It isn't strictly necessary for % \lwc/'s functionality; however, it is required for the % lengthened paragraphs to not have terrible spacing. -\RequirePackage[final]{microtype} +\RequirePackage{etoolbox} +\AtEndPreamble{ + \@ifpackageloaded{microtype}{}{ % Only load if not already loaded + \RequirePackage[ + final, + activate={true,nocompatibility} + ]{microtype} + } +} % Define \TeX{} wrappers for Lua functions \newcommand{\lwcenable}{\directlua{lwc.enable_callbacks()}} @@ -34,8 +49,6 @@ % Expansion of some parts of the document, such as section headings, is quite % undesirable, so we'll disable \lwc/ for certain commands. -\RequirePackage{etoolbox} - \newcommand{\lwc@patch@warning}[1]{\PackageWarning{lua-widow-control}{% Patching the \protect#1 command failed% }} diff --git a/macros/luatex/generic/lua-widow-control/lua-widow-control.tex b/macros/luatex/generic/lua-widow-control/lua-widow-control.tex index a9b236f966..efab23b8b4 100644 --- a/macros/luatex/generic/lua-widow-control/lua-widow-control.tex +++ b/macros/luatex/generic/lua-widow-control/lua-widow-control.tex @@ -3,7 +3,14 @@ % SPDX-License-Identifier: MPL-2.0+ % SPDX-FileCopyrightText: 2021 Max Chernoff -\wlog{lua-widow-control v1.1.4} %%version +\wlog{lua-widow-control v1.1.5} %%version + +\ifx\directlua\undefined + \errmessage{% + LuaTeX is required for this package. + Make sure to compile with `luatex'% + } +\fi \input ltluatex % \LuaTeX{}Base diff --git a/macros/luatex/generic/lua-widow-control/lwc-documentation.tex b/macros/luatex/generic/lua-widow-control/lwc-documentation.tex index bf0bf8877b..564f51618a 100644 --- a/macros/luatex/generic/lua-widow-control/lwc-documentation.tex +++ b/macros/luatex/generic/lua-widow-control/lwc-documentation.tex @@ -37,7 +37,7 @@ \startdocument[ title=lua-widow-control, author=Max Chernoff, - version=1.1.4, %%version + version=1.1.5, %%version github=https://github.com/gucci-on-fleek/lua-widow-control, ctan=https://www.ctan.org/pkg/lua-widow-control, ] diff --git a/macros/luatex/generic/lua-widow-control/lwc-sample.tex b/macros/luatex/generic/lua-widow-control/lwc-sample.tex index fc773ea11e..143f3cbc8c 100644 --- a/macros/luatex/generic/lua-widow-control/lwc-sample.tex +++ b/macros/luatex/generic/lua-widow-control/lwc-sample.tex @@ -34,6 +34,8 @@ \setupalign[hz,hanging,tolerant] + \setuplanguage[en][spacing=packed] + \starttext \Lwc/ can remove most widows and orphans from a document, \emph{without} stretching any glue or shortening any pages. diff --git a/macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkxl b/macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkxl index 436eb880cb..b38d6eda01 100644 --- a/macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkxl +++ b/macros/luatex/generic/lua-widow-control/t-lua-widow-control.mkxl @@ -1,10 +1,10 @@ %D \module %D [ file=t-lua-widow-control, -%D version=1.1.4, %%version +%D version=1.1.5, %%version %D title=lua-widow-control, %D subtitle=\ConTeXt module for lua-widow-control, %D author=Max Chernoff, -%D date=2022-02-04, %%date +%D date=2022-02-15, %%date %D copyright=Max Chernoff, %D license=MPL-2.0+, %D url=https://github.com/gucci-on-fleek/lua-widow-control] -- cgit v1.2.3