diff options
author | Norbert Preining <norbert@preining.info> | 2024-02-16 03:01:49 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2024-02-16 03:01:49 +0000 |
commit | a6e02d45ad0d10cfc3256fc91abe80d6228325a4 (patch) | |
tree | 6d63cc33763dc264246cd1f7bcd9b8482acf956d /macros | |
parent | 5b6839a58ea5468b40ebd52b579e680b8e62ff13 (diff) |
CTAN sync 202402160301
Diffstat (limited to 'macros')
90 files changed, 1033 insertions, 675 deletions
diff --git a/macros/latex/contrib/expex-glossonly/README.md b/macros/latex/contrib/expex-glossonly/README.md index 2b05c5d588..e52d03d019 100644 --- a/macros/latex/contrib/expex-glossonly/README.md +++ b/macros/latex/contrib/expex-glossonly/README.md @@ -1,6 +1,6 @@ # The `expex-glossonly` package -## Version 0.9 2024/02/05 +## Version 0.9b 2024/02/14 `expex-glossonly` is a package which allows users of other popular example numbering package (`gb4e`, `linguex`, and `covington`) to use the glossing macros of the ExPex package, while still using the standard example and subexample numbering macros of those respective packages. diff --git a/macros/latex/contrib/expex-glossonly/expex-glossonly.pdf b/macros/latex/contrib/expex-glossonly/expex-glossonly.pdf Binary files differindex b696ad8916..680c2d4d6e 100644 --- a/macros/latex/contrib/expex-glossonly/expex-glossonly.pdf +++ b/macros/latex/contrib/expex-glossonly/expex-glossonly.pdf diff --git a/macros/latex/contrib/expex-glossonly/expex-glossonly.sty b/macros/latex/contrib/expex-glossonly/expex-glossonly.sty index 95547ec2e0..eb263cfa2b 100644 --- a/macros/latex/contrib/expex-glossonly/expex-glossonly.sty +++ b/macros/latex/contrib/expex-glossonly/expex-glossonly.sty @@ -1,5 +1,5 @@ -\def\EPGL@version{0.9} -\def\EPGL@date{2024/2/5} +\def\EPGL@version{0.9b} +\def\EPGL@date{2024-02-14} % expex-glossonly is a package which allows gb4e and linguex and covington users to use % the glossing macros of the ExPex package, while still using the standard example and % subexample numbering macros of those respective packages. diff --git a/macros/latex/contrib/expex-glossonly/expex-glossonly.tex b/macros/latex/contrib/expex-glossonly/expex-glossonly.tex index 1301a2ad1e..215e81252c 100644 --- a/macros/latex/contrib/expex-glossonly/expex-glossonly.tex +++ b/macros/latex/contrib/expex-glossonly/expex-glossonly.tex @@ -1,6 +1,6 @@ % !TEX TS-program = lualatexmk -\def\EPGLversion{0.9} -\def\EPGLdate{February 5, 2024} +\def\EPGLversion{0.9b} +\def\EPGLdate{February 14, 2024} \documentclass[11pt]{article} \title{\textbf{The \textsf{expex-glossonly} package}} \author{\textbf{Alan Munn}\\Department of Linguistics, Languages, and Cultures\\Michigan State University\\\texttt{\href{mailto:amunn@msu.edu}{amunn@msu.edu}}} diff --git a/macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.pdf b/macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.pdf Binary files differindex 3011a8b577..1525b3eb00 100644 --- a/macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.pdf +++ b/macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.pdf diff --git a/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.pdf b/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.pdf Binary files differindex 679b7e39c7..b8846c8303 100644 --- a/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.pdf +++ b/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.pdf diff --git a/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.tex b/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.tex index dac96724ef..7a9c9ab122 100644 --- a/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.tex +++ b/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.tex @@ -2,7 +2,6 @@ \documentclass[12pt,letterpaper]{article} \usepackage[linguex]{expex-glossonly} - \begin{document} % Examples here show with and without grammaticality judgements. % Also a mixture of ExPex and linguex glossing in the same example set. diff --git a/macros/latex/contrib/siunitx/CHANGELOG.md b/macros/latex/contrib/siunitx/CHANGELOG.md index fcdd23876f..2c9d384bf9 100644 --- a/macros/latex/contrib/siunitx/CHANGELOG.md +++ b/macros/latex/contrib/siunitx/CHANGELOG.md @@ -7,6 +7,19 @@ Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to ## [Unreleased] +## [v3.3.12] - 2024-02-15 + +### Fixed +- Normalize active `<`/`>`in numerical input (see issue + [\#355](https://github.com/josephwright/siunitx/issues/355)) +- Allow for `\protect` inside symbolic units (see issue + [\#443](https://github.com/josephwright/siunitx/issues/443)) +- Do not error for entirely empty numerical input (see issue + [\#539](https://github.com/josephwright/siunitx/issues/539)) +- Print all numerical material in math mode when + `parse-numbers = false` is set (see issue + [\#721](https://github.com/josephwright/siunitx/issues/721)) + ## [v3.3.11] - 2024-02-07 ### Fixed @@ -2067,7 +2080,8 @@ Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to ### Added - First public testing release (as `si`) -[Unreleased]: https://github.com/josephwright/siunitx/compare/v3.3.11...HEAD +[Unreleased]: https://github.com/josephwright/siunitx/compare/v3.3.12...HEAD +[v3.3.12]: https://github.com/josephwright/siunitx/compare/v3.3.11...v3.3.12 [v3.3.11]: https://github.com/josephwright/siunitx/compare/v3.3.10...v3.3.11 [v3.3.10]: https://github.com/josephwright/siunitx/compare/v3.3.9...v3.3.10 [v3.3.9]: https://github.com/josephwright/siunitx/compare/v3.3.8...v3.3.9 diff --git a/macros/latex/contrib/siunitx/README.md b/macros/latex/contrib/siunitx/README.md index 1288929a5d..9b5881aead 100644 --- a/macros/latex/contrib/siunitx/README.md +++ b/macros/latex/contrib/siunitx/README.md @@ -21,4 +21,4 @@ This package is maintained by Joseph Wright: joseph.wright@morningstar2.co.uk ## License -Released under the LaTeX Project Public License v1.3c or later. See http://www.latex-project.org/lppl.txt
\ No newline at end of file +Released under the LaTeX Project Public License v1.3c or later. See https://www.latex-project.org/lppl.txt
\ No newline at end of file diff --git a/macros/latex/contrib/siunitx/siunitx-code.pdf b/macros/latex/contrib/siunitx/siunitx-code.pdf Binary files differindex 06b482440b..71adbfb38c 100644 --- a/macros/latex/contrib/siunitx/siunitx-code.pdf +++ b/macros/latex/contrib/siunitx/siunitx-code.pdf diff --git a/macros/latex/contrib/siunitx/siunitx-number.dtx b/macros/latex/contrib/siunitx/siunitx-number.dtx index 19e2c32e9b..8c94cefee4 100644 --- a/macros/latex/contrib/siunitx/siunitx-number.dtx +++ b/macros/latex/contrib/siunitx/siunitx-number.dtx @@ -764,9 +764,12 @@ \bool_if:NTF \l_siunitx_number_parse_bool { \siunitx_number_parse:nN {#1} \l_@@_parsed_tl - \siunitx_number_process:NN \l_@@_parsed_tl \l_@@_parsed_tl - \tl_set:Nx \l_@@_outputted_tl - { \siunitx_number_output:N \l_@@_parsed_tl } + \tl_if_empty:NF \l_@@_parsed_tl + { + \siunitx_number_process:NN \l_@@_parsed_tl \l_@@_parsed_tl + \tl_set:Nx \l_@@_outputted_tl + { \siunitx_number_output:N \l_@@_parsed_tl } + } } { \tl_set:Nn \l_@@_outputted_tl { \ensuremath {#1} } } \exp_args:NNNV \group_end: @@ -978,16 +981,16 @@ % % \begin{macro}{\siunitx_number_normalize_symbols:N} % \begin{macro}{\@@_normalize_aux:nN} -% \begin{macro}{\@@_normalize_sign:N} +% \begin{macro}{\@@_normalize_actives:N} % \begin{variable}{\c_@@_normalize_tl} -% There are two parts to the replacement code. First, any active -% hyphens signs are normalised: these can come up with some packages and +% There are two parts to the replacement code. First, any actives +% are normalised: these can come up with some packages and % cause issues. Multi-token signs then are converted to the single token % equivalents so that everything else can work on a one token basis. % \begin{macrocode} \cs_new_protected:Npn \siunitx_number_normalize_symbols:N #1 { - \@@_normalize_minus:N #1 + \@@_normalize_actives:N #1 \exp_after:wN \@@_normalize_aux:NnN \exp_after:wN #1 \c_@@_normalize_tl { ? } \q_recursion_tail @@ -1010,10 +1013,16 @@ } \group_begin: \char_set_catcode_active:N \- - \cs_new_protected:Npx \@@_normalize_minus:N #1 + \char_set_catcode_active:N \< + \char_set_catcode_active:N \> + \cs_new_protected:Npx \@@_normalize_actives:N #1 { \tl_replace_all:Nnn #1 { \exp_not:N - } { \token_to_str:N - } + \tl_replace_all:Nnn #1 + { \exp_not:N < } { \token_to_str:N < } + \tl_replace_all:Nnn #1 + { \exp_not:N > } { \token_to_str:N > } } \group_end: % \end{macrocode} @@ -1059,8 +1068,10 @@ \tl_map_inline:Nn \l_@@_input_ignore_tl { \tl_remove_all:Nn \l_@@_arg_tl {##1} } \tl_if_empty:NF \l_@@_arg_tl - { \@@_parse_comparator: } - \@@_parse_check: + { + \@@_parse_comparator: + \@@_parse_check: + } \exp_args:NNNV \group_end: \tl_set:Nn #2 \l_@@_parsed_tl } diff --git a/macros/latex/contrib/siunitx/siunitx-print.dtx b/macros/latex/contrib/siunitx/siunitx-print.dtx index 8d969925dd..9cc2e6aca2 100644 --- a/macros/latex/contrib/siunitx/siunitx-print.dtx +++ b/macros/latex/contrib/siunitx/siunitx-print.dtx @@ -344,8 +344,8 @@ % Color support is always required; to avoid a potential clash we delay to % the start of the document. % \begin{macrocode} -\cs_if_exist:NTF \hook_gput_code:nnn - { \hook_gput_code:nnn { begindocument / before } { siunitx } } +\cs_if_exist:NTF \AddToHook + { \AddToHook { begindocument / before } } { \AtBeginDocument } { \RequirePackage { color } } % \end{macrocode} @@ -466,6 +466,7 @@ % \siunitx_print_unit:o % } % \begin{macro}{\@@_aux:nn} +% \begin{macro}{\@@_number:n, \@@_unit:n} % The main printing function doesn't actually need to do very much: just set % the color and select the correct sub-function. The \cs{tl_if_empty:oF} is % needed to allow a leading \texttt{1} to be omitted in the case of a unit @@ -485,19 +486,22 @@ \tl_if_empty:cTF { l_@@_ #1 _color_tl } { \use:n } { \ExpandArgs { v } \textcolor { l_@@_ #1 _color_tl } } - { - \use:c - { - siunitx_print_ - \tl_use:c { l_@@_ #1 _mode_tl } :n - } - {#2} - } + { \use:c { @@ _ #1 :n } {#2} } } } +\cs_new_protected:Npn \@@_number:n #1 + { + \bool_if:NTF \l_siunitx_number_parse_bool + { \use:c { siunitx_print_ \l_@@_number_mode_tl :n } } + { \siunitx_print_math:n } + {#1} + } +\cs_new_protected:Npn \@@_unit:n #1 + { \use:c { siunitx_print_ \l_@@_unit_mode_tl :n } {#1} } % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} % % \begin{macro}{\siunitx_print_match:n} % When the \emph{output} mode should match the input, a simple selection of diff --git a/macros/latex/contrib/siunitx/siunitx-unit.dtx b/macros/latex/contrib/siunitx/siunitx-unit.dtx index 8c94acad0e..6c0210cec1 100644 --- a/macros/latex/contrib/siunitx/siunitx-unit.dtx +++ b/macros/latex/contrib/siunitx/siunitx-unit.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% File: siunitx-unit.dtx Copyright (C) 2014-2023 Joseph Wright +% File: siunitx-unit.dtx Copyright (C) 2014-2024 Joseph Wright % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this @@ -770,13 +770,24 @@ % the approach used is to set all of the symbolic unit commands expandable % and to do nothing, with the few special cases handled manually. We expand % the input here twice: this handles the case where there is a mapping or -% similar in |#1| which returns its result in \cs{exp_not:n}. +% similar in |#1| which returns its result in \cs{exp_not:n}. In the second +% \tn{protected@edef}, changing the meaning of \tn{@unexpandable@protect} +% allows removal of a literal \cs{protect} at the top level before +% known symbolic entries: this deals with the case where the user has +% put in a \cs{protect} for some edge cases. % \begin{macrocode} \prg_new_protected_conditional:Npnn \@@_if_symbolic:n #1 { TF } { \group_begin: \bool_set_true:N \l_@@_test_bool \protected@edef \l_@@_tmp_tl {#1} + \cs_set_eq:NN \@@_saved_@unexpandable@protect: \@unexpandable@protect + \cs_set_nopar:Npn \@unexpandable@protect ##1 + { + \cs_if_exist:cF { @@_ \token_to_str:N ##1 :w } + { \@@_saved_@unexpandable@protect: } + ##1 + } \protected@edef \l_@@_tmp_tl { \l_@@_tmp_tl } \exp_args:NNV \group_end: \tl_if_blank:nTF \l_@@_tmp_tl diff --git a/macros/latex/contrib/siunitx/siunitx.dtx b/macros/latex/contrib/siunitx/siunitx.dtx index 4d6874c512..bd231a50f7 100644 --- a/macros/latex/contrib/siunitx/siunitx.dtx +++ b/macros/latex/contrib/siunitx/siunitx.dtx @@ -121,7 +121,7 @@ % % Identify the package and give the over all version information. % \begin{macrocode} -\ProvidesExplPackage {siunitx} {2024-02-07} {3.3.11} +\ProvidesExplPackage {siunitx} {2024-02-15} {3.3.12} {A comprehensive (SI) units package} % \end{macrocode} % diff --git a/macros/latex/contrib/siunitx/siunitx.pdf b/macros/latex/contrib/siunitx/siunitx.pdf Binary files differindex 825cef3f2d..3d70a9723b 100644 --- a/macros/latex/contrib/siunitx/siunitx.pdf +++ b/macros/latex/contrib/siunitx/siunitx.pdf diff --git a/macros/luatex/generic/luaotfload/NEWS b/macros/luatex/generic/luaotfload/NEWS index d263b2e002..17ce0a00c4 100644 --- a/macros/luatex/generic/luaotfload/NEWS +++ b/macros/luatex/generic/luaotfload/NEWS @@ -1,5 +1,13 @@ Change History -------------- +2024-02-14 luaotfload v3.27 + + * Improved support for arabic mark rendering in \texttt{node} mode. + * Better ordering of GSUB substitutions. + * Avoid dropping hyphens in DVI mode + * Compatibility with \identifier{luatex} 1.18 + * Various bug fixes + 2023-08-31 luaotfload v3.26 * Reimplement mathsize feature recently dropped from fontloader diff --git a/macros/luatex/generic/luaotfload/README.md b/macros/luatex/generic/luaotfload/README.md index e22815220c..ed2ece5f29 100644 --- a/macros/luatex/generic/luaotfload/README.md +++ b/macros/luatex/generic/luaotfload/README.md @@ -1,8 +1,8 @@ # The Luaotfload Package -VERSION: 3.26 +VERSION: 3.27 -DATE: 2023-08-31 +DATE: 2024-02-14 ## Description diff --git a/macros/luatex/generic/luaotfload/filegraph.pdf b/macros/luatex/generic/luaotfload/filegraph.pdf Binary files differindex f4d68bbf6f..d0640d1ad6 100644 --- a/macros/luatex/generic/luaotfload/filegraph.pdf +++ b/macros/luatex/generic/luaotfload/filegraph.pdf diff --git a/macros/luatex/generic/luaotfload/fontloader-2023-08-19.lua b/macros/luatex/generic/luaotfload/fontloader-2023-12-28.lua index dd457f0221..562516746a 100644 --- a/macros/luatex/generic/luaotfload/fontloader-2023-08-19.lua +++ b/macros/luatex/generic/luaotfload/fontloader-2023-12-28.lua @@ -1,6 +1,6 @@ --[[info----------------------------------------------------------------------- Luaotfload fontloader package - build 2023-08-19 22:30:03 + build 2023-12-28 15:52:34 ------------------------------------------------------------------------------- © 2023 PRAGMA ADE / ConTeXt Development Team @@ -63,7 +63,7 @@ --info]]----------------------------------------------------------------------- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “data-con” b4ab51aaeab872d86d827f3e216bf05e] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “data-con” b4ab51aaeab872d86d827f3e216bf05e] --- if not modules then modules={} end modules ['data-con']={ version=1.100, @@ -186,10 +186,10 @@ function containers.cleanname(name) return (gsub(lower(name),"[^%w\128-\255]+","-")) end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “data-con”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “data-con”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “basics-nod” 1750af43148def9e7a75c6900a96f9dc] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “basics-nod” 1750af43148def9e7a75c6900a96f9dc] --- if not modules then modules={} end modules ['luatex-fonts-nod']={ version=1.001, @@ -456,10 +456,10 @@ do end end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “basics-nod”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “basics-nod”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “basics-chr” ce4afac7ba19471f3c8f90800839f315] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “basics-chr” ce4afac7ba19471f3c8f90800839f315] --- characters=characters or {} @@ -4293,10 +4293,10 @@ characters.indicgroups={ }, } -end --- [luaotfload, fontloader-2023-08-19.lua scope for “basics-chr”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “basics-chr”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ini” 16b855c98602e4a3e9df39512916a427] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ini” 16b855c98602e4a3e9df39512916a427] --- if not modules then modules={} end modules ['font-ini']={ version=1.001, @@ -4337,10 +4337,10 @@ if node and not tex.getfontoffamily then tex.getfontoffamily=node.family_font end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ini”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ini”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-mis” 17e967c9ec4d001deefd43ddf25e98f7] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-mis” 17e967c9ec4d001deefd43ddf25e98f7] --- if not modules then modules={} end modules ['luatex-font-mis']={ version=1.001, @@ -4372,10 +4372,10 @@ function font.each() return table.sortedhash(fonts.hashes.identifiers) end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-mis”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-mis”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-con” bdbaaa361308c9ccc0a7dac0bf6c17ec] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-con” ebdd0ca857deafdc0152c7a4f1ed2490] --- if not modules then modules={} end modules ['font-con']={ version=1.001, @@ -4858,6 +4858,13 @@ function constructors.scale(tfmdata,specification) if changed then local c=changed[unicode] if c and c~=unicode then + local cc=changed[c] + if cc then + while cc do + c=cc + cc=changed[c] + end + end if c then description=descriptions[c] or descriptions[unicode] or character character=characters[c] or character @@ -5733,10 +5740,10 @@ function constructors.addcoreunicodes(unicodes) return unicodes end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-con”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-con”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-enc” c24fd6b4f34f87b9c4ff5e6193ce2656] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-enc” c24fd6b4f34f87b9c4ff5e6193ce2656] --- if not modules then modules={} end modules ['luatex-font-enc']={ version=1.001, @@ -5811,10 +5818,10 @@ function encodings.load(filename) return containers.write(encodings.cache,name,data) end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-enc”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-enc”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-cid” 22b0367742fb253deef84ef7ccf5e8de] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-cid” 22b0367742fb253deef84ef7ccf5e8de] --- if not modules then modules={} end modules ['font-cid']={ version=1.001, @@ -5965,10 +5972,10 @@ function cid.getmap(specification) return found end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-cid”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-cid”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-map” 27ee748150e56f5f0e5f0fefc864f35e] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-map” b1444428c238a17d2a998ff1a4769183] --- if not modules then modules={} end modules ['font-map']={ version=1.001, @@ -6030,7 +6037,7 @@ local function tounicode16(unicode) return s_unknown else unicode=unicode-0x10000 - return f_double(idiv(k,0x400)+0xD800,unicode%0x400+0xDC00) + return f_double(idiv(unicode,0x400)+0xD800,unicode%0x400+0xDC00) end end local function tounicode16sequence(unicodes) @@ -6049,7 +6056,7 @@ local function tounicode16sequence(unicodes) t[l]=s_unknown else u=u-0x10000 - t[l]=f_double(idiv(k,0x400)+0xD800,u%0x400+0xDC00) + t[l]=f_double(idiv(u,0x400)+0xD800,u%0x400+0xDC00) end end return concat(t) @@ -6376,10 +6383,10 @@ function mappings.addtounicode(data,filename,checklookups,forceligatures) end end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-map”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-map”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-vfc” a81c29eda98cd62cbebdb6c93544b50d] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-vfc” a81c29eda98cd62cbebdb6c93544b50d] --- if not modules then modules={} end modules ['font-vfc']={ version=1.001, @@ -6476,10 +6483,10 @@ helpers.commands=utilities.storage.allocate { dummy=dummy, } -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-vfc”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-vfc”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otr” 2958a21bebcf0579f4e11f0646d1b402] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otr” 2958a21bebcf0579f4e11f0646d1b402] --- if not modules then modules={} end modules ['font-otr']={ version=1.001, @@ -8328,10 +8335,10 @@ function readers.extend(fontdata) end end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otr”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otr”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-oti” 309a75f9c14b77d87e94eba827dc4e71] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-oti” 309a75f9c14b77d87e94eba827dc4e71] --- if not modules then modules={} end modules ['font-oti']={ version=1.001, @@ -8474,10 +8481,10 @@ function otffeatures.checkeddefaultlanguage(featuretype,autolanguage,languages) end end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-oti”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-oti”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ott” 427bdc77dd187158eafb79b7193400dc] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ott” 427bdc77dd187158eafb79b7193400dc] --- if not modules then modules={} end modules ["font-ott"]={ version=1.001, @@ -9636,10 +9643,10 @@ function otffeatures.normalize(features,wrap) end end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ott”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ott”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-cff” 999da544079698ce70178fd84bcdd67a] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-cff” 999da544079698ce70178fd84bcdd67a] --- if not modules then modules={} end modules ['font-cff']={ version=1.001, @@ -11913,10 +11920,10 @@ function readers.cff2(f,fontdata,specification) end end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-cff”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-cff”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ttf” ff94e130d7c71edd899c4bae7745b7db] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ttf” ff94e130d7c71edd899c4bae7745b7db] --- if not modules then modules={} end modules ['font-ttf']={ version=1.001, @@ -13172,10 +13179,10 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata) end end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ttf”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ttf”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-dsp” 755beef1b31e9dfd050e9d221d4e9ae3] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-dsp” f2897da5fd67280b4700c32696d21fb1] --- if not modules then modules={} end modules ['font-dsp']={ version=1.001, @@ -14877,7 +14884,7 @@ do end return features end - local function readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder) + local function readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder,nofmarkclasses) setposition(f,lookupoffset) local noflookups=readushort(f) local lookups=readcardinaltable(f,noflookups,ushort) @@ -14894,12 +14901,12 @@ do subtables[j]=offset+readushort(f) end local markclass=band(flagbits,0x0010)~=0 + local markset=rshift(flagbits,8) if markclass then markclass=readushort(f) end - local markset=rshift(flagbits,8) if markset>0 then - markclass=markset + markclass=nofmarkclasses+markset end lookups[lookupid]={ type=lookuptype, @@ -15243,7 +15250,8 @@ do if not lookupstoo then return end - local lookups=readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder) + local nofmarkclasses=(fontdata.markclasses and #fontdata.markclasses or 0)-(fontdata.marksets and #fontdata.marksets or 0) + local lookups=readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder,nofmarkclasses) if lookups then resolvelookups(f,lookupoffset,fontdata,lookups,lookuptypes,lookuphandlers,what,tableoffset) end @@ -15412,6 +15420,7 @@ function readers.gdef(f,fontdata,specification) end end if marksetsoffset~=0 then + local nofmarkclasses=fontdata.markclasses and #fontdata.markclasses or 0 marksetsoffset=tableoffset+marksetsoffset setposition(f,marksetsoffset) local format=readushort(f) @@ -15421,7 +15430,8 @@ function readers.gdef(f,fontdata,specification) for i=1,nofsets do local offset=sets[i] if offset~=0 then - marksets[i]=readcoverage(f,marksetsoffset+offset) + markclasses[nofmarkclasses+i]=readcoverage(f,marksetsoffset+offset) + marksets[i]={} end end end @@ -16468,10 +16478,10 @@ function readers.mvar(f,fontdata,specification) end end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-dsp”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-dsp”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-oup” aaff9c28233bbea56e6d27ae50e04ff0] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-oup” aaff9c28233bbea56e6d27ae50e04ff0] --- if not modules then modules={} end modules ['font-oup']={ version=1.001, @@ -19327,10 +19337,10 @@ end expandlookups(sublookups,sequences) end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-oup”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-oup”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otl” 21196d193ce16f3996c9aa75e81e440c] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otl” 84499d355f82829841b8e304952a9d5d] --- if not modules then modules={} end modules ['font-otl']={ version=1.001, @@ -19358,7 +19368,7 @@ local trace_defining=false registertracker("fonts.defining",function(v) trace_d local report_otf=logs.reporter("fonts","otf loading") local fonts=fonts local otf=fonts.handlers.otf -otf.version=3.133 +otf.version=3.134 otf.cache=containers.define("fonts","otl",otf.version,true) otf.svgcache=containers.define("fonts","svg",otf.version,true) otf.pngcache=containers.define("fonts","png",otf.version,true) @@ -20040,10 +20050,10 @@ otf.coverup={ end } -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otl”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otl”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-oto” 1cc20f34606fb55d4646a0dd323499ef] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-oto” b148d66f642aaa3d0ddc427f71d6e02d] --- if not modules then modules={} end modules ['font-oto']={ version=1.001, @@ -20244,7 +20254,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis for i=1,#steps do for unicode,data in next,steps[i].coverage do if unicode~=data then - changed[unicode]=data + changed[unicode]=changed[unicode] or data end if trace_singles then report_substitution(feature,sequence,descriptions,unicode,data) @@ -20257,7 +20267,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis local replacement=data[alternate] if replacement then if unicode~=replacement then - changed[unicode]=replacement + changed[unicode]=changed[unicode] or replacement end if trace_alternatives then report_alternate(feature,sequence,descriptions,unicode,replacement,value,"normal") @@ -20265,7 +20275,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis elseif defaultalt=="first" then replacement=data[1] if unicode~=replacement then - changed[unicode]=replacement + changed[unicode]=changed[unicode] or replacement end if trace_alternatives then report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt) @@ -20273,7 +20283,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis elseif defaultalt=="last" then replacement=data[#data] if unicode~=replacement then - changed[unicode]=replacement + changed[unicode]=changed[unicode] or replacement end if trace_alternatives then report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt) @@ -20512,10 +20522,10 @@ registerotffeature { } otf.basemodeinitializer=featuresinitializer -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-oto”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-oto”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otj” b2c165bd6771a57633f992d07384b739] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otj” b2c165bd6771a57633f992d07384b739] --- if not modules then modules={} end modules ['font-otj']={ version=1.001, @@ -22008,10 +22018,10 @@ function injections.handler(head,where) end end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otj”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otj”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ota” 7407b709ae7b2cdf36f68d5c98d51d12] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ota” 7407b709ae7b2cdf36f68d5c98d51d12] --- if not modules then modules={} end modules ['font-ota']={ version=1.001, @@ -22505,10 +22515,10 @@ directives.register("otf.analyze.useunicodemarks",function(v) analyzers.useunicodemarks=v end) -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ota”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ota”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ots” c039b20490b526ec469e41a8584ebe6d] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ots” 2ba92e909a45b68592f7271d8190f390] --- if not modules then modules={} end modules ['font-ots']={ version=1.001, @@ -24561,17 +24571,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s if last then local char,id=ischar(last,currentfont) if char then - if skiphash and skiphash[char] then + if seq[n][char] then + if n<l then + last=getnext(last) + end + n=n+1 + elseif skiphash and skiphash[char] then skipped=true if trace_skips then show_skip(dataset,sequence,char,ck,classes[char]) end last=getnext(last) - elseif seq[n][char] then - if n<l then - last=getnext(last) - end - n=n+1 elseif discfound then notmatchreplace[discfound]=true if notmatchpre[discfound] then @@ -24662,17 +24672,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s if prev then local char,id=ischar(prev,currentfont) if char then - if skiphash and skiphash[char] then + if seq[n][char] then + if n>1 then + prev=getprev(prev) + end + n=n-1 + elseif skiphash and skiphash[char] then skipped=true if trace_skips then show_skip(dataset,sequence,char,ck,classes[char]) end prev=getprev(prev) - elseif seq[n][char] then - if n>1 then - prev=getprev(prev) - end - n=n-1 elseif discfound then notmatchreplace[discfound]=true if notmatchpost[discfound] then @@ -24778,17 +24788,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s if current then local char,id=ischar(current,currentfont) if char then - if skiphash and skiphash[char] then + if seq[n][char] then + if n<s then + current=getnext(current) + end + n=n+1 + elseif skiphash and skiphash[char] then skipped=true if trace_skips then show_skip(dataset,sequence,char,ck,classes[char]) end - current=getnext(current) - elseif seq[n][char] then - if n<s then - current=getnext(current) - end - n=n+1 + current=getnext(current) elseif discfound then notmatchreplace[discfound]=true if notmatchpre[discfound] then @@ -25733,32 +25743,28 @@ do while start do local char,id=ischar(start,font) if char then - if skiphash and skiphash[char] then - start=getnext(start) - else - local lookupmatch=lookupcache[char] - if lookupmatch then - local a - if attr then - if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then - a=true - end - elseif not attribute or getstate(start,attribute) then + local lookupmatch=lookupcache[char] + if lookupmatch then + local a + if attr then + if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then a=true end - if a then - local ok,df - head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) - if df then - elseif start then - start=getnext(start) - end - else + elseif not attribute or getstate(start,attribute) then + a=true + end + if a then + local ok,df + head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if df then + elseif start then start=getnext(start) end else - start=getnext(start) + start=getnext(start) end + else + start=getnext(start) end elseif char==false or id==glue_code then start=getnext(start) @@ -25788,46 +25794,42 @@ do while start do local char,id=ischar(start,font) if char then - if skiphash and skiphash[char] then - start=getnext(start) - else - local m=merged[char] - if m then - local a - if attr then - if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then - a=true - end - elseif not attribute or getstate(start,attribute) then + local m=merged[char] + if m then + local a + if attr then + if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then a=true end - if a then - local ok,df - for i=m[1],m[2] do - local step=steps[i] - local lookupcache=step.coverage - local lookupmatch=lookupcache[char] - if lookupmatch then - head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) - if df then - break - elseif ok then - break - elseif not start then - break - end + elseif not attribute or getstate(start,attribute) then + a=true + end + if a then + local ok,df + for i=m[1],m[2] do + local step=steps[i] + local lookupcache=step.coverage + local lookupmatch=lookupcache[char] + if lookupmatch then + head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if df then + break + elseif ok then + break + elseif not start then + break end end - if df then - elseif start then - start=getnext(start) - end - else + end + if df then + elseif start then start=getnext(start) end else start=getnext(start) end + else + start=getnext(start) end elseif char==false or id==glue_code then start=getnext(start) @@ -25895,26 +25897,22 @@ do position=position+1 local m=merged[char] if m then - if skiphash and skiphash[char] then - start=getnext(start) - else - for i=m[1],m[2] do - local step=steps[i] - local lookupcache=step.coverage - local lookupmatch=lookupcache[char] - if lookupmatch then - local ok - head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) - if ok then - break - elseif not start then - break - end + for i=m[1],m[2] do + local step=steps[i] + local lookupcache=step.coverage + local lookupmatch=lookupcache[char] + if lookupmatch then + local ok + head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if ok then + break + elseif not start then + break end end - if start then - start=getnext(start) - end + end + if start then + start=getnext(start) end else start=getnext(start) @@ -26210,10 +26208,10 @@ registerotffeature { }, } -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ots”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ots”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-osd” c38c14c118680202c6f4b09734542c49] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-osd” 837039b0dca88edd3f4b54222f7cf54c] --- if not modules then modules={} end modules ['font-osd']={ version=1.001, @@ -28847,10 +28845,10 @@ for i=1,nofscripts do methods[scripts_two[i]]=method_two end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-osd”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-osd”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ocl” 2a377351ae23c339764ec8ce2e8e9164] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ocl” 2a377351ae23c339764ec8ce2e8e9164] --- if not modules then modules={} end modules ['font-ocl']={ version=1.001, @@ -29398,10 +29396,10 @@ if context then } end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ocl”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ocl”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otc” 0ad931eec679ebeceed5d4f02f4ba31b] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otc” 0ad931eec679ebeceed5d4f02f4ba31b] --- if not modules then modules={} end modules ['font-otc']={ version=1.001, @@ -30233,10 +30231,10 @@ end otf.enhancers.enhance=enhance otf.enhancers.register("check extra features",enhance) -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otc”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otc”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-onr” a3f85c886cf22fb27760d98603d51ffd] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-onr” a3f85c886cf22fb27760d98603d51ffd] --- if not modules then modules={} end modules ['font-onr']={ version=1.001, @@ -30609,10 +30607,10 @@ function readers.getinfo(filename) end end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-onr”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-onr”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-one” b7fb0389462a49bc1f41bebd2da85401] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-one” b7fb0389462a49bc1f41bebd2da85401] --- if not modules then modules={} end modules ['font-one']={ version=1.001, @@ -31327,10 +31325,10 @@ registerafmenhancer("normalize features",enhance_normalize_features) registerafmenhancer("check extra features",otfenhancers.enhance) registerafmenhancer("fix names",enhance_fix_names) -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-one”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-one”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-afk” b7bef80aa4c18357cbfa0ae4df4d4046] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-afk” b7bef80aa4c18357cbfa0ae4df4d4046] --- if not modules then modules={} end modules ['font-afk']={ version=1.001, @@ -31497,10 +31495,10 @@ fonts.handlers.afm.helpdata={ } } -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-afk”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-afk”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-tfm” f0eb5e2a8068b17ad401bb7efdba1630] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-tfm” f0eb5e2a8068b17ad401bb7efdba1630] --- if not modules then modules={} end modules ['luatex-fonts-tfm']={ version=1.001, @@ -32015,10 +32013,10 @@ registertfmfeature { } } -end --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-tfm”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-tfm”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-lua” 1fbfdf7b689b2bdfd0e3bb9bf74ce136] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-lua” 1fbfdf7b689b2bdfd0e3bb9bf74ce136] --- if not modules then modules={} end modules ['font-lua']={ version=1.001, @@ -32058,10 +32056,10 @@ function readers.lua(specification) return check_lua(specification,fullname) end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-lua”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-lua”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-def” cec0e49aee881c4cbd36d541f0162c6f] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-def” cec0e49aee881c4cbd36d541f0162c6f] --- if not modules then modules={} end modules ['font-def']={ version=1.001, @@ -32461,10 +32459,10 @@ if not context then callbacks.register('define_font',definers.read,"definition of fonts (tfmdata preparation)") end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-def”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-def”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-shp” a174ac26390bd0828805747500df0077] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-shp” a174ac26390bd0828805747500df0077] --- if not modules then modules={} end modules ['font-shp']={ version=1.001, @@ -32831,10 +32829,10 @@ callback.register("glyph_stream_provider",function(id,index,mode) return "" end) -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-shp”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-shp”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-def” f435e0875f203f343157baeff876ec9c] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-def” f435e0875f203f343157baeff876ec9c] --- if not modules then modules={} end modules ['luatex-fonts-def']={ version=1.001, @@ -32915,10 +32913,10 @@ function fonts.definers.applypostprocessors(tfmdata) return tfmdata end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-def”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-def”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-ext” 32013cbc5d5d336be8b1d1e5879d86c4] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-ext” 32013cbc5d5d336be8b1d1e5879d86c4] --- if not modules then modules={} end modules ['luatex-fonts-ext']={ version=1.001, @@ -33104,10 +33102,10 @@ registerotffeature { } } -end --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-ext”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-ext”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-tex” 9882d382700e714cace08b7f09820958] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-tex” 9882d382700e714cace08b7f09820958] --- if not modules then modules={} end modules ['font-imp-tex']={ version=1.001, @@ -33212,10 +33210,10 @@ registerotffeature { description="arabic digits", } -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-tex”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-tex”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-ligatures” 250f6f4488ee770c23177afb2ff75676] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-ligatures” 250f6f4488ee770c23177afb2ff75676] --- if not modules then modules={} end modules ['font-imp-ligatures']={ version=1.001, @@ -33329,10 +33327,10 @@ if context then } end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-ligatures”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-ligatures”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-italics” 3cc555a1fe00dc45449f1e4a47a5c990] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-italics” 3cc555a1fe00dc45449f1e4a47a5c990] --- if not modules then modules={} end modules ['font-imp-italics']={ version=1.001, @@ -33417,10 +33415,10 @@ if context then registerafmfeature(dimensions_specification) end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-italics”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-italics”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-effects” d05997c1826355548ec9aec1346f9f23] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-effects” d05997c1826355548ec9aec1346f9f23] --- if not modules then modules={} end modules ['font-imp-effects']={ version=1.001, @@ -33777,10 +33775,10 @@ local specification={ registerotffeature(specification) registerafmfeature(specification) -end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-effects”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-effects”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-lig” fbd251eea3810a43a8d5542319361d68] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-lig” fbd251eea3810a43a8d5542319361d68] --- fonts.handlers.otf.addfeature { @@ -35849,10 +35847,10 @@ fonts.handlers.otf.addfeature { ["type"]="ligature", } -end --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-lig”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-lig”] --- -do --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-gbn” 34e4543a02f6fbc8c2ade896cb6dc7df] --- +do --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-gbn” 34e4543a02f6fbc8c2ade896cb6dc7df] --- if not modules then modules={} end modules ['luatex-fonts-gbn']={ version=1.001, @@ -36117,7 +36115,7 @@ function nodes.simple_font_handler(head,groupcode,size,packtype,direction) return head end -end --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-gbn”] --- +end --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-gbn”] --- --- vim:ft=lua:sw=2:ts=8:et:tw=79 diff --git a/macros/luatex/generic/luaotfload/fontloader-font-con.lua b/macros/luatex/generic/luaotfload/fontloader-font-con.lua index 10f98ca120..6005897796 100644 --- a/macros/luatex/generic/luaotfload/fontloader-font-con.lua +++ b/macros/luatex/generic/luaotfload/fontloader-font-con.lua @@ -651,13 +651,13 @@ function constructors.scale(tfmdata,specification) if changed then local c = changed[unicode] if c and c ~= unicode then - -- local cc = changed[c] - -- if cc then - -- while cc do - -- c = cc - -- cc = changed[c] - -- end - -- end + local cc = changed[c] + if cc then + while cc do + c = cc + cc = changed[c] + end + end -- check not needed: if c then description = descriptions[c] or descriptions[unicode] or character diff --git a/macros/luatex/generic/luaotfload/fontloader-font-dsp.lua b/macros/luatex/generic/luaotfload/fontloader-font-dsp.lua index 5f9cf1a62e..788c59322d 100644 --- a/macros/luatex/generic/luaotfload/fontloader-font-dsp.lua +++ b/macros/luatex/generic/luaotfload/fontloader-font-dsp.lua @@ -2134,7 +2134,7 @@ do return features end - local function readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder) + local function readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder,nofmarkclasses) setposition(f,lookupoffset) local noflookups = readushort(f) local lookups = readcardinaltable(f,noflookups,ushort) @@ -2152,12 +2152,12 @@ do end -- which one wins? local markclass = band(flagbits,0x0010) ~= 0 -- usemarkfilteringset + local markset = rshift(flagbits,8) if markclass then markclass = readushort(f) -- + 1 end - local markset = rshift(flagbits,8) if markset > 0 then - markclass = markset -- + 1 + markclass = nofmarkclasses + markset end lookups[lookupid] = { type = lookuptype, @@ -2559,7 +2559,8 @@ do return end -- - local lookups = readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder) + local nofmarkclasses = (fontdata.markclasses and #fontdata.markclasses or 0) - (fontdata.marksets and #fontdata.marksets or 0) + local lookups = readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder,nofmarkclasses) -- if lookups then resolvelookups(f,lookupoffset,fontdata,lookups,lookuptypes,lookuphandlers,what,tableoffset) @@ -2740,8 +2741,9 @@ function readers.gdef(f,fontdata,specification) end end end - -- mark sets : todo: just make the same as class sets above + -- mark sets if marksetsoffset ~= 0 then + local nofmarkclasses = fontdata.markclasses and #fontdata.markclasses or 0 marksetsoffset = tableoffset + marksetsoffset setposition(f,marksetsoffset) local format = readushort(f) @@ -2751,7 +2753,8 @@ function readers.gdef(f,fontdata,specification) for i=1,nofsets do local offset = sets[i] if offset ~= 0 then - marksets[i] = readcoverage(f,marksetsoffset+offset) + markclasses[nofmarkclasses + i] = readcoverage(f,marksetsoffset+offset) + marksets[i] = { } end end end diff --git a/macros/luatex/generic/luaotfload/fontloader-font-map.lua b/macros/luatex/generic/luaotfload/fontloader-font-map.lua index 4aa937ed16..3ead64d561 100644 --- a/macros/luatex/generic/luaotfload/fontloader-font-map.lua +++ b/macros/luatex/generic/luaotfload/fontloader-font-map.lua @@ -72,7 +72,7 @@ local function tounicode16(unicode) return s_unknown else unicode = unicode - 0x10000 - return f_double(idiv(k,0x400)+0xD800,unicode%0x400+0xDC00) + return f_double(idiv(unicode,0x400)+0xD800,unicode%0x400+0xDC00) end end @@ -93,7 +93,7 @@ local function tounicode16sequence(unicodes) t[l] = s_unknown else u = u - 0x10000 - t[l] = f_double(idiv(k,0x400)+0xD800,u%0x400+0xDC00) + t[l] = f_double(idiv(u,0x400)+0xD800,u%0x400+0xDC00) end end return concat(t) diff --git a/macros/luatex/generic/luaotfload/fontloader-font-osd.lua b/macros/luatex/generic/luaotfload/fontloader-font-osd.lua index 4177e3035a..cff9272741 100644 --- a/macros/luatex/generic/luaotfload/fontloader-font-osd.lua +++ b/macros/luatex/generic/luaotfload/fontloader-font-osd.lua @@ -220,6 +220,9 @@ end -- we might need to have consonants etc per script and initialize a local table -- pointing to the right one. But not now. +-- We have additional data in char-def that provides information not present (at +-- least when this was written) in Unicode. + local indicgroups = characters and characters.indicgroups if not indicgroups and characters then diff --git a/macros/luatex/generic/luaotfload/fontloader-font-otl.lua b/macros/luatex/generic/luaotfload/fontloader-font-otl.lua index 0825077b3f..57e219a4af 100644 --- a/macros/luatex/generic/luaotfload/fontloader-font-otl.lua +++ b/macros/luatex/generic/luaotfload/fontloader-font-otl.lua @@ -52,7 +52,7 @@ local report_otf = logs.reporter("fonts","otf loading") local fonts = fonts local otf = fonts.handlers.otf -otf.version = 3.133 -- beware: also sync font-mis.lua and in mtx-fonts +otf.version = 3.134 -- beware: also sync font-mis.lua and in mtx-fonts otf.cache = containers.define("fonts", "otl", otf.version, true) otf.svgcache = containers.define("fonts", "svg", otf.version, true) otf.pngcache = containers.define("fonts", "png", otf.version, true) diff --git a/macros/luatex/generic/luaotfload/fontloader-font-oto.lua b/macros/luatex/generic/luaotfload/fontloader-font-oto.lua index 0689f4dfb5..131cbbe3c5 100644 --- a/macros/luatex/generic/luaotfload/fontloader-font-oto.lua +++ b/macros/luatex/generic/luaotfload/fontloader-font-oto.lua @@ -263,9 +263,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis for i=1,#steps do for unicode, data in next, steps[i].coverage do if unicode ~= data then --- if not changed[unicode] then - changed[unicode] = data --- end + changed[unicode] = changed[unicode] or data end if trace_singles then report_substitution(feature,sequence,descriptions,unicode,data) @@ -278,9 +276,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis local replacement = data[alternate] if replacement then if unicode ~= replacement then --- if not changed[unicode] then - changed[unicode] = replacement --- end + changed[unicode] = changed[unicode] or replacement end if trace_alternatives then report_alternate(feature,sequence,descriptions,unicode,replacement,value,"normal") @@ -288,9 +284,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis elseif defaultalt == "first" then replacement = data[1] if unicode ~= replacement then --- if not changed[unicode] then - changed[unicode] = replacement --- end + changed[unicode] = changed[unicode] or replacement end if trace_alternatives then report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt) @@ -298,9 +292,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis elseif defaultalt == "last" then replacement = data[#data] if unicode ~= replacement then --- if not changed[unicode] then - changed[unicode] = replacement --- end + changed[unicode] = changed[unicode] or replacement end if trace_alternatives then report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt) diff --git a/macros/luatex/generic/luaotfload/fontloader-font-ots.lua b/macros/luatex/generic/luaotfload/fontloader-font-ots.lua index 48f85c3658..3b4f5b3cc7 100644 --- a/macros/luatex/generic/luaotfload/fontloader-font-ots.lua +++ b/macros/luatex/generic/luaotfload/fontloader-font-ots.lua @@ -2552,17 +2552,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s if last then local char, id = ischar(last,currentfont) if char then - if skiphash and skiphash[char] then + if seq[n][char] then + if n < l then + last = getnext(last) + end + n = n + 1 + elseif skiphash and skiphash[char] then skipped = true if trace_skips then show_skip(dataset,sequence,char,ck,classes[char]) end last = getnext(last) - elseif seq[n][char] then - if n < l then - last = getnext(last) - end - n = n + 1 elseif discfound then notmatchreplace[discfound] = true if notmatchpre[discfound] then @@ -2661,17 +2661,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s if prev then local char, id = ischar(prev,currentfont) if char then - if skiphash and skiphash[char] then + if seq[n][char] then + if n > 1 then + prev = getprev(prev) + end + n = n - 1 + elseif skiphash and skiphash[char] then skipped = true if trace_skips then show_skip(dataset,sequence,char,ck,classes[char]) end prev = getprev(prev) - elseif seq[n][char] then - if n > 1 then - prev = getprev(prev) - end - n = n - 1 elseif discfound then notmatchreplace[discfound] = true if notmatchpost[discfound] then @@ -2792,17 +2792,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s if current then local char, id = ischar(current,currentfont) if char then - if skiphash and skiphash[char] then + if seq[n][char] then + if n < s then + current = getnext(current) + end + n = n + 1 + elseif skiphash and skiphash[char] then skipped = true if trace_skips then show_skip(dataset,sequence,char,ck,classes[char]) end - current = getnext(current) -- was absent - elseif seq[n][char] then - if n < s then -- new test - current = getnext(current) -- was absent - end - n = n + 1 + current = getnext(current) elseif discfound then notmatchreplace[discfound] = true if notmatchpre[discfound] then @@ -3978,36 +3978,32 @@ do while start do local char, id = ischar(start,font) if char then - if skiphash and skiphash[char] then -- we never needed it here but let's try - start = getnext(start) - else - local lookupmatch = lookupcache[char] - if lookupmatch then - local a -- happens often so no assignment is faster - if attr then - if getglyphdata(start) == attr and (not attribute or getstate(start,attribute)) then - a = true - end - elseif not attribute or getstate(start,attribute) then + local lookupmatch = lookupcache[char] + if lookupmatch then + local a -- happens often so no assignment is faster + if attr then + if getglyphdata(start) == attr and (not attribute or getstate(start,attribute)) then a = true end - if a then - local ok, df - head, start, ok, df = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) - -- if ok then - -- done = true - -- end - if df then + elseif not attribute or getstate(start,attribute) then + a = true + end + if a then + local ok, df + head, start, ok, df = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + -- if ok then + -- done = true + -- end + if df then -- print("restart 1",typ) - elseif start then - start = getnext(start) - end - else + elseif start then start = getnext(start) end else - start = getnext(start) + start = getnext(start) end + else + start = getnext(start) end elseif char == false or id == glue_code then -- a different font|state or glue (happens often) @@ -4041,53 +4037,49 @@ do while start do local char, id = ischar(start,font) if char then - if skiphash and skiphash[char] then -- we never needed it here but let's try - start = getnext(start) - else - local m = merged[char] - if m then - local a -- happens often so no assignment is faster - if attr then - if getglyphdata(start) == attr and (not attribute or getstate(start,attribute)) then - a = true - end - elseif not attribute or getstate(start,attribute) then + local m = merged[char] + if m then + local a -- happens often so no assignment is faster + if attr then + if getglyphdata(start) == attr and (not attribute or getstate(start,attribute)) then a = true end - if a then - local ok, df - for i=m[1],m[2] do - local step = steps[i] - -- for i=1,#m do - -- local step = m[i] - local lookupcache = step.coverage - local lookupmatch = lookupcache[char] - if lookupmatch then - -- we could move all code inline but that makes things even more unreadable + elseif not attribute or getstate(start,attribute) then + a = true + end + if a then + local ok, df + for i=m[1],m[2] do + local step = steps[i] + -- for i=1,#m do + -- local step = m[i] + local lookupcache = step.coverage + local lookupmatch = lookupcache[char] + if lookupmatch then + -- we could move all code inline but that makes things even more unreadable -- local ok, df - head, start, ok, df = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) - if df then - break - elseif ok then - -- done = true - break - elseif not start then - -- don't ask why ... shouldn't happen - break - end + head, start, ok, df = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if df then + break + elseif ok then + -- done = true + break + elseif not start then + -- don't ask why ... shouldn't happen + break end end - if df then + end + if df then -- print("restart 2",typ) - elseif start then - start = getnext(start) - end - else + elseif start then start = getnext(start) end else start = getnext(start) end + else + start = getnext(start) end elseif char == false or id == glue_code then -- a different font|state or glue (happens often) @@ -4183,31 +4175,27 @@ do position = position + 1 local m = merged[char] if m then - if skiphash and skiphash[char] then -- we never needed it here but let's try - start = getnext(start) - else - for i=m[1],m[2] do - local step = steps[i] - local lookupcache = step.coverage - local lookupmatch = lookupcache[char] - if lookupmatch then - local ok - head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) - if ok then - -- if matches then - -- matches[position] = i - -- else - -- matches = { [position] = i } - -- end - break - elseif not start then - break - end + for i=m[1],m[2] do + local step = steps[i] + local lookupcache = step.coverage + local lookupmatch = lookupcache[char] + if lookupmatch then + local ok + head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if ok then + -- if matches then + -- matches[position] = i + -- else + -- matches = { [position] = i } + -- end + break + elseif not start then + break end end - if start then - start = getnext(start) - end + end + if start then + start = getnext(start) end else start = getnext(start) diff --git a/macros/luatex/generic/luaotfload/fontloader-l-table.lua b/macros/luatex/generic/luaotfload/fontloader-l-table.lua index b6c3744b8b..429466179e 100644 --- a/macros/luatex/generic/luaotfload/fontloader-l-table.lua +++ b/macros/luatex/generic/luaotfload/fontloader-l-table.lua @@ -740,7 +740,8 @@ local function do_serialize(root,name,depth,level,indexed) if accurate then handle(format("%s %s=%q,",depth,k,v)) else - handle(format("%s %s=%s,",depth,k,v)) +-- handle(format("%s %s=%s,",depth,k,v)) + handle(format("%s %s=0x%X,",depth,k,v)) end elseif accurate then handle(format("%s %s=%q,",depth,k,v)) @@ -752,7 +753,8 @@ local function do_serialize(root,name,depth,level,indexed) if accurate then handle(format("%s [%q]=%q,",depth,k,v)) else - handle(format("%s [%q]=%s,",depth,k,v)) +-- handle(format("%s [%q]=%s,",depth,k,v)) + handle(format("%s [%q]=0x%X,",depth,k,v)) end elseif accurate then handle(format("%s [%q]=%q,",depth,k,v)) diff --git a/macros/luatex/generic/luaotfload/fontloader-reference.lua b/macros/luatex/generic/luaotfload/fontloader-reference.lua index 6997a417a7..8cff7fb909 100644 --- a/macros/luatex/generic/luaotfload/fontloader-reference.lua +++ b/macros/luatex/generic/luaotfload/fontloader-reference.lua @@ -1,6 +1,6 @@ -- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/sources/luatex-fonts.lua --- merge date : 2023-08-16 19:31 +-- merge date : 2023-09-26 18:19 do -- begin closure to overcome local limits and interference @@ -1578,7 +1578,7 @@ local function do_serialize(root,name,depth,level,indexed) if accurate then handle(format("%s %s=%q,",depth,k,v)) else - handle(format("%s %s=%s,",depth,k,v)) + handle(format("%s %s=0x%X,",depth,k,v)) end elseif accurate then handle(format("%s %s=%q,",depth,k,v)) @@ -1590,7 +1590,7 @@ local function do_serialize(root,name,depth,level,indexed) if accurate then handle(format("%s [%q]=%q,",depth,k,v)) else - handle(format("%s [%q]=%s,",depth,k,v)) + handle(format("%s [%q]=0x%X,",depth,k,v)) end elseif accurate then handle(format("%s [%q]=%q,",depth,k,v)) @@ -4103,6 +4103,20 @@ do return cache[s] end end +if CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 then + local t={ + ["#"]="#H", + ["\n"]="#L", + ['"']="#Q", + ["\r"]="#R", + [" "]="#S", + ["\t"]="#T", + ["\\"]="#X", + } + function string.texhashed(s) + return (gsub(s,".",t)) + end +end end -- closure @@ -10814,7 +10828,7 @@ local function tounicode16(unicode) return s_unknown else unicode=unicode-0x10000 - return f_double(idiv(k,0x400)+0xD800,unicode%0x400+0xDC00) + return f_double(idiv(unicode,0x400)+0xD800,unicode%0x400+0xDC00) end end local function tounicode16sequence(unicodes) @@ -10833,7 +10847,7 @@ local function tounicode16sequence(unicodes) t[l]=s_unknown else u=u-0x10000 - t[l]=f_double(idiv(k,0x400)+0xD800,u%0x400+0xDC00) + t[l]=f_double(idiv(u,0x400)+0xD800,u%0x400+0xDC00) end end return concat(t) @@ -18425,7 +18439,7 @@ do end return features end - local function readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder) + local function readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder,nofmarkclasses) setposition(f,lookupoffset) local noflookups=readushort(f) local lookups=readcardinaltable(f,noflookups,ushort) @@ -18442,12 +18456,12 @@ do subtables[j]=offset+readushort(f) end local markclass=band(flagbits,0x0010)~=0 + local markset=rshift(flagbits,8) if markclass then markclass=readushort(f) end - local markset=rshift(flagbits,8) if markset>0 then - markclass=markset + markclass=nofmarkclasses+markset end lookups[lookupid]={ type=lookuptype, @@ -18791,7 +18805,8 @@ do if not lookupstoo then return end - local lookups=readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder) + local nofmarkclasses=(fontdata.markclasses and #fontdata.markclasses or 0)-(fontdata.marksets and #fontdata.marksets or 0) + local lookups=readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder,nofmarkclasses) if lookups then resolvelookups(f,lookupoffset,fontdata,lookups,lookuptypes,lookuphandlers,what,tableoffset) end @@ -18960,6 +18975,7 @@ function readers.gdef(f,fontdata,specification) end end if marksetsoffset~=0 then + local nofmarkclasses=fontdata.markclasses and #fontdata.markclasses or 0 marksetsoffset=tableoffset+marksetsoffset setposition(f,marksetsoffset) local format=readushort(f) @@ -18969,7 +18985,8 @@ function readers.gdef(f,fontdata,specification) for i=1,nofsets do local offset=sets[i] if offset~=0 then - marksets[i]=readcoverage(f,marksetsoffset+offset) + markclasses[nofmarkclasses+i]=readcoverage(f,marksetsoffset+offset) + marksets[i]={} end end end @@ -21352,7 +21369,7 @@ local trace_defining=false registertracker("fonts.defining",function(v) trace_d local report_otf=logs.reporter("fonts","otf loading") local fonts=fonts local otf=fonts.handlers.otf -otf.version=3.133 +otf.version=3.134 otf.cache=containers.define("fonts","otl",otf.version,true) otf.svgcache=containers.define("fonts","svg",otf.version,true) otf.pngcache=containers.define("fonts","png",otf.version,true) @@ -29402,17 +29419,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s if last then local char,id=ischar(last,currentfont) if char then - if skiphash and skiphash[char] then + if seq[n][char] then + if n<l then + last=getnext(last) + end + n=n+1 + elseif skiphash and skiphash[char] then skipped=true if trace_skips then show_skip(dataset,sequence,char,ck,classes[char]) end last=getnext(last) - elseif seq[n][char] then - if n<l then - last=getnext(last) - end - n=n+1 elseif discfound then notmatchreplace[discfound]=true if notmatchpre[discfound] then @@ -29503,17 +29520,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s if prev then local char,id=ischar(prev,currentfont) if char then - if skiphash and skiphash[char] then + if seq[n][char] then + if n>1 then + prev=getprev(prev) + end + n=n-1 + elseif skiphash and skiphash[char] then skipped=true if trace_skips then show_skip(dataset,sequence,char,ck,classes[char]) end prev=getprev(prev) - elseif seq[n][char] then - if n>1 then - prev=getprev(prev) - end - n=n-1 elseif discfound then notmatchreplace[discfound]=true if notmatchpost[discfound] then @@ -29619,17 +29636,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s if current then local char,id=ischar(current,currentfont) if char then - if skiphash and skiphash[char] then + if seq[n][char] then + if n<s then + current=getnext(current) + end + n=n+1 + elseif skiphash and skiphash[char] then skipped=true if trace_skips then show_skip(dataset,sequence,char,ck,classes[char]) end - current=getnext(current) - elseif seq[n][char] then - if n<s then - current=getnext(current) - end - n=n+1 + current=getnext(current) elseif discfound then notmatchreplace[discfound]=true if notmatchpre[discfound] then @@ -30574,32 +30591,28 @@ do while start do local char,id=ischar(start,font) if char then - if skiphash and skiphash[char] then - start=getnext(start) - else - local lookupmatch=lookupcache[char] - if lookupmatch then - local a - if attr then - if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then - a=true - end - elseif not attribute or getstate(start,attribute) then + local lookupmatch=lookupcache[char] + if lookupmatch then + local a + if attr then + if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then a=true end - if a then - local ok,df - head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) - if df then - elseif start then - start=getnext(start) - end - else + elseif not attribute or getstate(start,attribute) then + a=true + end + if a then + local ok,df + head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if df then + elseif start then start=getnext(start) end else - start=getnext(start) + start=getnext(start) end + else + start=getnext(start) end elseif char==false or id==glue_code then start=getnext(start) @@ -30629,46 +30642,42 @@ do while start do local char,id=ischar(start,font) if char then - if skiphash and skiphash[char] then - start=getnext(start) - else - local m=merged[char] - if m then - local a - if attr then - if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then - a=true - end - elseif not attribute or getstate(start,attribute) then + local m=merged[char] + if m then + local a + if attr then + if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then a=true end - if a then - local ok,df - for i=m[1],m[2] do - local step=steps[i] - local lookupcache=step.coverage - local lookupmatch=lookupcache[char] - if lookupmatch then - head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) - if df then - break - elseif ok then - break - elseif not start then - break - end + elseif not attribute or getstate(start,attribute) then + a=true + end + if a then + local ok,df + for i=m[1],m[2] do + local step=steps[i] + local lookupcache=step.coverage + local lookupmatch=lookupcache[char] + if lookupmatch then + head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if df then + break + elseif ok then + break + elseif not start then + break end end - if df then - elseif start then - start=getnext(start) - end - else + end + if df then + elseif start then start=getnext(start) end else start=getnext(start) end + else + start=getnext(start) end elseif char==false or id==glue_code then start=getnext(start) @@ -30736,26 +30745,22 @@ do position=position+1 local m=merged[char] if m then - if skiphash and skiphash[char] then - start=getnext(start) - else - for i=m[1],m[2] do - local step=steps[i] - local lookupcache=step.coverage - local lookupmatch=lookupcache[char] - if lookupmatch then - local ok - head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) - if ok then - break - elseif not start then - break - end + for i=m[1],m[2] do + local step=steps[i] + local lookupcache=step.coverage + local lookupmatch=lookupcache[char] + if lookupmatch then + local ok + head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if ok then + break + elseif not start then + break end end - if start then - start=getnext(start) - end + end + if start then + start=getnext(start) end else start=getnext(start) diff --git a/macros/luatex/generic/luaotfload/fontloader-util-str.lua b/macros/luatex/generic/luaotfload/fontloader-util-str.lua index a9150b886a..3663b38489 100644 --- a/macros/luatex/generic/luaotfload/fontloader-util-str.lua +++ b/macros/luatex/generic/luaotfload/fontloader-util-str.lua @@ -315,7 +315,8 @@ function strings.collapse(str) -- maybe also in strings return str and lpegmatch(p_prune_intospace,str) or str end --- local s = "\naa\n\naa\na a\n\n" +-- local s = " \naa\n\naa\na a\n\n " +-- local s = [[ \naa\n\naa\na a\n\n]] -- print("["..strings.striplines(s,"collapse all").."]") -- also see: string.collapsespaces @@ -1557,3 +1558,20 @@ do end +if CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 then + + local t = { + ["#"] = "#H", + ["\n"] = "#L", + ['"'] = "#Q", + ["\r"] = "#R", + [" "] = "#S", + ["\t"] = "#T", + ["\\"] = "#X", + } + + function string.texhashed(s) + return (gsub(s,".",t)) + end + +end diff --git a/macros/luatex/generic/luaotfload/luaotfload-arabic.lua b/macros/luatex/generic/luaotfload/luaotfload-arabic.lua new file mode 100644 index 0000000000..ac599ebca7 --- /dev/null +++ b/macros/luatex/generic/luaotfload/luaotfload-arabic.lua @@ -0,0 +1,143 @@ +----------------------------------------------------------------------- +-- FILE: luaotfload-arabic.lua +-- DESCRIPTION: part of luaotfload / arabic specific support +----------------------------------------------------------------------- + +assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { + name = "luaotfload-arabic", + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE + description = "luaotfload submodule / features", + license = "GPL v2.0", + author = "Marcel Krüger", + copyright = "The LaTeX Project", +} + +local unicode = require'luaotfload-unicode' +local ccc = unicode.ccc + +local node_new = node.direct.new +local setlink = node.direct.setlink +local is_char = node.direct.is_char +local getnext = node.direct.getnext + +-- Mark combining marks +local mcm = { + [0x0654] = true, -- ARABIC HAMZA ABOVE + [0x0655] = true, -- ARABIC HAMZA BELOW + [0x0658] = true, -- ARABIC MARK NOON GHUNNA + [0x06DC] = true, -- ARABIC SMALL HIGH SEEN + [0x06E3] = true, -- ARABIC SMALL LOW SEEN + [0x06E7] = true, -- ARABIC SMALL HIGH YEH + [0x06E8] = true, -- ARABIC SMALL HIGH NOON + [0x08CA] = true, -- ARABIC SMALL HIGH FARSI YEH + [0x08CB] = true, -- ARABIC SMALL HIGH YEH BARREE WITH TWO DOTS BELOW + [0x08CD] = true, -- ARABIC SMALL HIGH ZAH + [0x08CE] = true, -- ARABIC LARGE ROUND DOT ABOVE + [0x08CF] = true, -- ARABIC LARGE ROUND DOT BELOW + [0x08D3] = true, -- ARABIC SMALL LOW WAW + [0x08F3] = true, -- ARABIC SMALL HIGH WAW +} + +-- Implement AMTRA from UTR #53. +-- This assumes that the text is already normalized according to NFD. For most +-- fonts, normalizing to NFC should be good enough. +local function reorder_amtra(head, f) + local n = head + while n do + local base, prev = n + prev, n = n, getnext(n) + while true do + local char = is_char(n, f) -- is_char(nil, f) == is_char(0, f) == nil + local this_ccc = ccc[char] + if not this_ccc then break end -- ! This `break` is the hot path + if this_ccc == 33 then + local after_33, tail_33 = n + repeat + tail_33 = after_33 + after_33 = getnext(tail_33) + local char = is_char(after_33, f) + local after_ccc = ccc[char] + until after_ccc ~= 33 + setlink(prev, after_33) + setlink(tail_33, getnext(base)) + setlink(base, n) + if prev == base then + prev = tail_33 + end + n = after_33 + elseif this_ccc == 220 then + local after_220, tail_220, found = n + repeat + tail_220 = after_220 + after_220 = getnext(tail_220) + local char = is_char(after_220, f) + if mcm[char] then found = true end + local after_ccc = ccc[char] + until after_ccc ~= 220 + if found then + setlink(prev, after_220) + setlink(tail_220, getnext(base)) + setlink(base, n) + if prev == base then + prev = tail_220 + end + n = after_220 + base = tail_220 -- Because ccc230 should get inserted after this + else + prev, n = tail_220, after_220 + end + elseif this_ccc == 230 then + local after_230, tail_230, found = n + repeat + tail_230 = after_230 + after_230 = getnext(tail_230) + local char = is_char(after_230, f) + if mcm[char] then found = true end + local after_ccc = ccc[char] + until after_ccc ~= 230 + if found then + setlink(prev, after_230) + setlink(tail_230, getnext(base)) + setlink(base, n) + if prev == base then + prev = tail_230 + end + n = after_230 + else + prev, n = tail_220, after_220 + end + else + prev, n = n, getnext(n) + end + end + end + return n +end + +-- We need to run after normalize and ideally directly afterwards. So try to insert after normalize +-- or default to the start of the list such that normalize can insert itself before us later. +local normalize_index = 0 +for i, manipulator in ipairs(fonts.constructors.features.otf.processors.node) do + if manipulator.name == 'normalize' then + normalize_index = i + end +end +fonts.constructors.features.otf.register { + name = 'amtra', + default = 'auto', + description = 'Apply Unicode Arabic Mark Rendering', + initializers = { + node = function(fonttable, value, features) + if values == 'auto' then + features.amtra = fonttable.properties.script == 'arab' + end + end, + }, + processors = { + position = normalize_index + 1, + node = function(head, f) + return reorder_amtra(head, f) + end, + }, +} diff --git a/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua b/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua index 5e2022a18b..71abb0e1bd 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua @@ -6,8 +6,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-auxiliary", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / auxiliary functions", license = "GPL v2.0" } diff --git a/macros/luatex/generic/luaotfload/luaotfload-colors.lua b/macros/luatex/generic/luaotfload/luaotfload-colors.lua index 2d8942a3d9..944d1745e4 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-colors.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-colors.lua @@ -5,8 +5,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-colors", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / color", license = "GPL v2.0", author = "Khaled Hosny, Elie Roux, Philipp Gesang, Dohyun Kim, David Carlisle", diff --git a/macros/luatex/generic/luaotfload/luaotfload-conf.pdf b/macros/luatex/generic/luaotfload/luaotfload-conf.pdf Binary files differindex 078ba7de52..001729a1e2 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-conf.pdf +++ b/macros/luatex/generic/luaotfload/luaotfload-conf.pdf diff --git a/macros/luatex/generic/luaotfload/luaotfload-configuration.lua b/macros/luatex/generic/luaotfload/luaotfload-configuration.lua index b59897b217..d8590666af 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-configuration.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-configuration.lua @@ -7,8 +7,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-configuration", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / config file reader", license = "GPL v2.0" } diff --git a/macros/luatex/generic/luaotfload/luaotfload-database.lua b/macros/luatex/generic/luaotfload/luaotfload-database.lua index 9b81f6a3d0..f1b59fcc7b 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-database.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-database.lua @@ -5,8 +5,8 @@ do -- block to avoid to many local variables error assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-database", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / database", license = "GPL v2.0", author = "Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger", @@ -150,7 +150,6 @@ local kpsefind_file = kpse.find_file local kpselookup = kpse.lookup local kpsereadable_file = kpse.readable_file local lfsattributes = lfs.attributes -local lfschdir = lfs.chdir local lfscurrentdir = lfs.currentdir local lfsdir = lfs.dir local mathabs = math.abs @@ -202,6 +201,7 @@ local resolversfindfile = context_environment.resolvers.findfile --- some of our own local unicode = require'luaotfload-unicode' local casefold = require'lua-uni-case'.casefold +local realpath = require'luaotfload-realpath'.realpath local alphnum_only = unicode.alphnum_only local name_index = nil --> upvalue for names.data @@ -318,49 +318,53 @@ local function sanitize_fontnames (rawnames) return result end -local function find_files_indeed (acc, dirs, filter) - if not next (dirs) then --- done - return acc +local list_dir_or_empty do + local function inner_list_dir_or_empty (dir, success, ...) + if success then + return ... + else + -- Skipping unreadable directory. + -- TODO: Print warning + return next, {} + end + end + function list_dir_or_empty (dir) + return inner_list_dir_or_empty(dir, pcall(lfsdir, dir)) end +end - local pwd = lfscurrentdir () - local dir = dirs[#dirs] - dirs[#dirs] = nil +local function dummyfilter () return true end + +--- the optional filter function receives the full path of a file +--- system entity. a filter applies if the first argument it returns is +--- true. + +--- string -> function? -> string list +local function find_files (root, filter) + if not lfsisdir (root) then return end + + local files = {} + local dirs = { root } + filter = filter or dummyfilter - if lfschdir (dir) then - lfschdir (pwd) + while dirs[1] do + local dir = dirs[#dirs] + dirs[#dirs] = nil - local newfiles = { } - for ent in lfsdir (dir) do + for ent in list_dir_or_empty (dir) do if ent ~= "." and ent ~= ".." then local fullpath = dir .. "/" .. ent if filter (fullpath) == true then if lfsisdir (fullpath) then dirs[#dirs+1] = fullpath elseif lfsisfile (fullpath) then - newfiles[#newfiles+1] = fullpath + files[#files+1] = fullpath end end end end - return find_files_indeed (tableappend (acc, newfiles), - dirs, filter) - end - --- could not cd into, so we skip it - return find_files_indeed (acc, dirs, filter) -end - -local function dummyfilter () return true end - ---- the optional filter function receives the full path of a file ---- system entity. a filter applies if the first argument it returns is ---- true. - ---- string -> function? -> string list -local function find_files (root, filter) - if lfsisdir (root) then - return find_files_indeed ({}, { root }, filter or dummyfilter) end + return files end @@ -2177,17 +2181,19 @@ local function process_dir_tree (acc, dirs, done) return acc end - local pwd = lfscurrentdir () local dir = dirs[#dirs] dirs[#dirs] = nil - if not lfschdir (dir) then - --- Cannot cd; skip. + local mode_or_err + dir, mode_or_err = realpath(dir) + if not dir then + logreport ("both", 1, "db", "Skipping font directory: %s", mode_or_err) + return process_dir_tree (acc, dirs, done) + elseif mode_or_err ~= 'directory' then + logreport ("both", 1, "db", "Skipping non-directory while searching fonts: %q (%s)", dir, mode_or_err) return process_dir_tree (acc, dirs, done) end - dir = lfscurrentdir () --- resolve symlinks - lfschdir (pwd) if tablecontains (done, dir) then --- Already traversed. Note that it’d be unsafe to rely on the --- hash part above due to Lua only processing up to 32 bytes @@ -2226,35 +2232,38 @@ local function process_dir_tree (acc, dirs, done) end local function process_dir (dir) - local pwd = lfscurrentdir () - if lfschdir (dir) then - dir = lfscurrentdir () --- resolve symlinks - lfschdir (pwd) - - local files = { } - local blacklist = names.blacklist - for ent in lfsdir (dir) do - if ent ~= "." and ent ~= ".." and not blacklist[ent] then - local fullpath = dir .. "/" .. ent - if lfsisfile (fullpath) then - ent = stringlower (ent) - if lpegmatch (p_font_filter, ent) - then - if filesuffix (ent) == "afm" then - local pfbpath = locate_matching_pfb (ent, dir) - if pfbpath then - files[#files+1] = pfbpath - end - else - files[#files+1] = fullpath + local mode_or_err + dir, mode_or_err = realpath(dir) + if not dir then + logreport ("both", 1, "db", "Skipping font directory: %s", mode_or_err) + return {} + elseif mode_or_err ~= 'directory' then + logreport ("both", 1, "db", "Skipping non-directory while searching fonts: %q (%s)", dir, mode_or_err) + return {} + end + + local files = { } + local blacklist = names.blacklist + for ent in lfsdir (dir) do + if ent ~= "." and ent ~= ".." and not blacklist[ent] then + local fullpath = dir .. "/" .. ent + if lfsisfile (fullpath) then + ent = stringlower (ent) + if lpegmatch (p_font_filter, ent) + then + if filesuffix (ent) == "afm" then + local pfbpath = locate_matching_pfb (ent, dir) + if pfbpath then + files[#files+1] = pfbpath end + else + files[#files+1] = fullpath end end end end - return files end - return { } + return files end --- string -> bool -> string list diff --git a/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua b/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua index 1a48ec9a08..83780b9929 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua @@ -7,8 +7,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-diagnostics", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload-tool submodule / diagnostics", license = "GPL v2.0" } diff --git a/macros/luatex/generic/luaotfload/luaotfload-dvi.lua b/macros/luatex/generic/luaotfload/luaotfload-dvi.lua index c1b6d227c9..f8d4d268f7 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-dvi.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-dvi.lua @@ -6,8 +6,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-dvi", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / DVI", license = "GPL v2.0", author = "Marcel Krüger", @@ -85,7 +85,7 @@ function full_hprocess(head) end if last_mapping then local mapped = last_mapping[c] - if mapped then setfont(n, mapped_font, mapped) end + if mapped then setfont(n, last_mapped_font, mapped) end end end elseif id == glyph_t then diff --git a/macros/luatex/generic/luaotfload/luaotfload-embolden.lua b/macros/luatex/generic/luaotfload/luaotfload-embolden.lua index fad5ce7b2c..caff50ed4d 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-embolden.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-embolden.lua @@ -5,8 +5,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-embolden", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / embolden", license = "GPL v2.0", author = "Marcel Krüger" diff --git a/macros/luatex/generic/luaotfload/luaotfload-fallback.lua b/macros/luatex/generic/luaotfload/luaotfload-fallback.lua index ef0ce1fb63..a527095618 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-fallback.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-fallback.lua @@ -5,8 +5,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-fallback", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / fallback", license = "GPL v2.0", author = "Marcel Krüger" diff --git a/macros/luatex/generic/luaotfload/luaotfload-features.lua b/macros/luatex/generic/luaotfload/luaotfload-features.lua index 862f50aad3..d4d96217aa 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-features.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-features.lua @@ -5,8 +5,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-features", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / features", license = "GPL v2.0", author = "Hans Hagen, Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger", @@ -890,6 +890,7 @@ fonts.constructors.features.otf.register { end, }, } +require'luaotfload-arabic' -- mathsize feature for compatibility with older fontloader versions -- Not all that useful in most cases since it leads to messy font sizes, diff --git a/macros/luatex/generic/luaotfload/luaotfload-filelist.lua b/macros/luatex/generic/luaotfload/luaotfload-filelist.lua index fea69928b5..9b5f618cc2 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-filelist.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-filelist.lua @@ -6,8 +6,8 @@ if luaotfload_module then luaotfload_module { name = "luaotfload-filelist", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / filelist", license = "GPL v2.0" } end diff --git a/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua b/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua index 370cfbd611..f300d4955d 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua @@ -1,8 +1,8 @@ if luaotfload_module then luaotfload_module { name = "luaotfload-glyphlist", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / autogenerated glyphlist", copyright = "derived from https://raw.githubusercontent.com/adobe-type-tools/agl-aglfn/master/glyphlist.txt", original = "Adobe Glyph List, version 2.0, September 20, 2002", diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua index 32cad5fc54..7eb795d176 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua @@ -5,8 +5,8 @@ do -- block to avoid to many local variables error assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-harf-define", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / HarfBuzz font loading", license = "GPL v2.0", author = "Khaled Hosny, Marcel Krüger", diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua index e9d4a15b9f..5c2d13df00 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua @@ -4,8 +4,8 @@ ----------------------------------------------------------------------- assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-harf-plug", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / HarfBuzz shaping", license = "GPL v2.0", author = "Khaled Hosny, Marcel Krüger", diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-var-cff2.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-var-cff2.lua index 063b99c2be..ad8fbdcd26 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-harf-var-cff2.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-harf-var-cff2.lua @@ -5,8 +5,8 @@ do assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-harf-var-cff2", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / CFF2 table processing", license = "GPL v2.0", author = "Marcel Krüger", diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-var-t2-writer.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-var-t2-writer.lua index 491c127f9c..1d40d09ad0 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-harf-var-t2-writer.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-harf-var-t2-writer.lua @@ -5,8 +5,8 @@ do assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-harf-var-t2-writer", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / Type 2 charstring writer", license = "GPL v2.0", author = "Marcel Krüger", diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-var-ttf.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-var-ttf.lua index 0853a62fc4..a6d4d36aba 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-harf-var-ttf.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-harf-var-ttf.lua @@ -5,8 +5,8 @@ do assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-harf-var-ttf", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / gvar table processing", license = "GPL v2.0", author = "Marcel Krüger", diff --git a/macros/luatex/generic/luaotfload/luaotfload-init.lua b/macros/luatex/generic/luaotfload/luaotfload-init.lua index 78cb99ff7e..13b1099752 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-init.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-init.lua @@ -7,8 +7,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-init", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / initialization", license = "GPL v2.0" } diff --git a/macros/luatex/generic/luaotfload/luaotfload-latex.pdf b/macros/luatex/generic/luaotfload/luaotfload-latex.pdf Binary files differindex 8368bd9db3..bc1e5abae6 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-latex.pdf +++ b/macros/luatex/generic/luaotfload/luaotfload-latex.pdf diff --git a/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua b/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua index d641b028bf..b2b848bfc6 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua @@ -5,8 +5,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-letterspace", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / letterspacing", license = "GPL v2.0", copyright = "PRAGMA ADE / ConTeXt Development Team", diff --git a/macros/luatex/generic/luaotfload/luaotfload-loaders.lua b/macros/luatex/generic/luaotfload/luaotfload-loaders.lua index eceaff8188..86f48ee69a 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-loaders.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-loaders.lua @@ -8,8 +8,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-loaders", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / callback handling", license = "GPL v2.0" } diff --git a/macros/luatex/generic/luaotfload/luaotfload-log.lua b/macros/luatex/generic/luaotfload/luaotfload-log.lua index 95f02beed5..d22c48eda5 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-log.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-log.lua @@ -6,8 +6,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-log", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / logging", license = "GPL v2.0", author = "Khaled Hosny, Elie Roux, Philipp Gesang", diff --git a/macros/luatex/generic/luaotfload/luaotfload-main.tex b/macros/luatex/generic/luaotfload/luaotfload-main.tex index 1df20a5cee..f631263dee 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-main.tex +++ b/macros/luatex/generic/luaotfload/luaotfload-main.tex @@ -32,7 +32,7 @@ \beginfrontmatter \setdocumenttitle {The \identifier{luaotfload} package} - \setdocumentdate {2023-08-31 v3.26} + \setdocumentdate {2024-02-14 v3.27} \setdocumentauthor {LaTeX3 Project\\ Elie Roux · Khaled Hosny · Philipp Gesang · Ulrike Fischer · Marcel Krüger\\ Home: \hyperlink {https://github.com/latex3/luaotfload}} @@ -62,6 +62,16 @@ Supported is the \identifier{luatex} versions of a current TeXLive 2019 (and a c \endsection \beginsection{Changes} +\beginsubsection{New in version 3.27} +\begin{itemize} + \item Improved support for arabic mark rendering in \texttt{node} mode. + \item Better ordering of GSUB substitutions. + \item Avoid dropping hyphens in DVI mode + \item Compatibility with \identifier{luatex} 1.18 + \item Various bug fixes +\end{itemize} +\endsubsection + \beginsubsection{New in version 3.24} \begin{itemize} \item Add experimental configuration option to change default font lookup location diff --git a/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua b/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua index 2b2136ff68..c3a611a1f8 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua @@ -5,8 +5,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-multiscript", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / multiscript", license = "GPL v2.0", author = "Marcel Krüger" diff --git a/macros/luatex/generic/luaotfload/luaotfload-notdef.lua b/macros/luatex/generic/luaotfload/luaotfload-notdef.lua index 311a377148..f738fbdae9 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-notdef.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-notdef.lua @@ -5,8 +5,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-notdef", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / notdef", license = "GPL v2.0", author = "Marcel Krüger" diff --git a/macros/luatex/generic/luaotfload/luaotfload-parsers.lua b/macros/luatex/generic/luaotfload/luaotfload-parsers.lua index 2650e21e61..27c8c449ca 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-parsers.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-parsers.lua @@ -7,8 +7,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-parsers", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / parsers", license = "GPL v2.0" } diff --git a/macros/luatex/generic/luaotfload/luaotfload-realpath.lua b/macros/luatex/generic/luaotfload/luaotfload-realpath.lua new file mode 100644 index 0000000000..2738da8a1b --- /dev/null +++ b/macros/luatex/generic/luaotfload/luaotfload-realpath.lua @@ -0,0 +1,131 @@ +-- Helper to resolve symlinks in paths + +local sub = string.sub +local symlinkattributes = lfs.symlinkattributes +local attributes = lfs.attributes +local currentdir = lfs.currentdir +local concat = table.concat +local move = table.move +local newtable = lua.newtable +local setmetatable = setmetatable + +-- Marker key for elements of result_tree to indicate the path components entry and the file mode +local path_components, file_mode = {}, {} +local tree_root + +local split_path do + local l = lpeg + local separator = os.type == 'unix' and l.S'/' or l.S'/\\' + -- We do not allow empty segments here because they get ignored. + local segment = l.C((1 - separator)^1) + -- Duplicate and trailing separators are dropped. + local unc = os.type == 'unix' and l.P(false) or separator * separator * l.Cg(l.P(1)^0 * -1, 'unc') + local drive_letter = os.type == 'unix' and l.P(false) or l.Cg(l.R('az', 'AZ') * ':', 'drive') + local path_pat = l.Ct(unc + drive_letter^-1 * (l.Cc'' * separator^1)^-1 * (segment * separator^1)^0 * segment^-1 * -1) + function split_path(path) + local splitted = path_pat:match(path) + if not splitted then + error'Invalid path rejected' + elseif splitted.unc then + error'Unsupported UNC path encountered' + elseif splitted.drive and splitted[1] ~= '' then + error'Unsupported relative path with drive letter encountered' + end + return splitted + end +end + +local function recombine_path(components) + local joined = concat(components, '/') + if components.drive then + joined = components.drive .. joined + end + return joined +end + +local function lookup_split_path_in_tree(components, tree) + if components[1] == '' then + tree = tree_root + end + for i=1, #components do + local next_tree = tree[components[i]] + if not next_tree then + return nil, string.format("Unable to find %q in %q", components[i], recombine_path(tree[path_components])) + end + tree = next_tree + end + return tree +end + +local tree_meta +tree_meta = { + __index = function(parent, component) + local parent_components = parent[path_components] + local depth = #parent_components + local components = move(parent[path_components], 1, depth, 1, newtable(depth + 1, 0)) + components[depth + 1] = component + local path = recombine_path(components) + + local mode = symlinkattributes(path, 'mode') + if not mode then + parent[component] = false + return false + end + if mode == 'link' then + local target = symlinkattributes(path, 'target') + local splitted_target = split_path(target) + local target_tree = lookup_split_path_in_tree(splitted_target, parent) or false + parent[component] = target_tree + return target_tree + end + + local child = { + [path_components] = components, + [file_mode] = mode, + } + if mode == 'directory' then + setmetatable(child, tree_meta) + child['.'] = child + child['..'] = parent + end + parent[component] = child + return child + end, +} + +-- We assume that the directory structure does not change during our run. +function build_root_dir(drive) + local root_dir = setmetatable({ + [path_components] = {'', drive = drive}, + [file_mode] = 'directory', -- "If [your root is not a directory] you are having a bad problem and you will not go to space today". + }, tree_meta) + root_dir['.'] = root_dir + root_dir['..'] = root_dir + return root_dir +end +tree_root = os.type == 'unix' and build_root_dir() or setmetatable({}, {__index = function(t, drive) + local root_dir = build_root_dir(drive) + t[drive] = root_dir + return root_dir +end}) + +local function resolve_path_to_tree(path) + local splitted = split_path(path) + if splitted[1] == '' then -- Optimization to avoid currentdir lookup. + return lookup_split_path_in_tree(splitted, tree_root) + else + local splitted_currentdir = split_path(currentdir()) + local current_tree = assert(lookup_split_path_in_tree(splitted_currentdir, tree_root)) + return lookup_split_path_in_tree(splitted, current_tree) + end +end + +local function resolve_path(path) + local tree, err = resolve_path_to_tree(path) + if not tree then return tree, err end + return recombine_path(tree[path_components]), tree[file_mode] +end + +return { + realpath = resolve_path, +} diff --git a/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua b/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua index a719d8f91b..93e8f61c30 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua @@ -11,8 +11,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-resolvers", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / resolvers", license = "GPL v2.0" } diff --git a/macros/luatex/generic/luaotfload/luaotfload-scripts.lua b/macros/luatex/generic/luaotfload/luaotfload-scripts.lua index 5ee0b451a5..75f9e3b579 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-scripts.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-scripts.lua @@ -5,8 +5,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-script", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / Script helpers", license = "CC0 1.0 Universal", author = "Marcel Krüger" diff --git a/macros/luatex/generic/luaotfload/luaotfload-status.lua b/macros/luatex/generic/luaotfload/luaotfload-status.lua index 78d097c0f2..530fc06edd 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-status.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-status.lua @@ -1,14 +1,14 @@ return { ["hashes"]={ - { "fontloader-2023-08-19.lua", "5e8a5e13801cd8eff23f5e8dc4cbbc10" }, + { "fontloader-2023-12-28.lua", "f33a8946b4d6a005e76276706db83059" }, { "fontloader-util-fil.lua", "d0accf4180201efd567816a25ad5e037" }, - { "fontloader-util-str.lua", "9a601a851ef3595cddc01b40dc79e1d6" }, + { "fontloader-util-str.lua", "f9cf43057eb25bbf466821908686fc3d" }, { "fontloader-l-unicode.lua", "f368874f11f3c525de5864fd413e4b24" }, { "fontloader-l-math.lua", "e19c80b7e700a69df942d4df2e14aa28" }, { "fontloader-l-boolean.lua", "abe28515dd33e8f6c416c09bca351cf8" }, { "fontloader-l-file.lua", "525b1c6af6f94d93ae929bfbe980d656" }, { "fontloader-l-io.lua", "3396a8644bae37e49b2cfc0c388c78f8" }, - { "fontloader-l-table.lua", "87aad875871bba16bbf7d4c3208b3637" }, + { "fontloader-l-table.lua", "baa3aea43dbc57e6fb5ff7850129218c" }, { "fontloader-l-string.lua", "3e97812b1d8eff26f19837ab00813e71" }, { "fontloader-l-function.lua", "a7e68a9703c35238729da41a474e951b" }, { "fontloader-l-lpeg.lua", "8315a56e6bc7b2ede3f70c49bf2b5af5" }, @@ -33,67 +33,67 @@ return { { "fontloader-font-one.lua", "b7fb0389462a49bc1f41bebd2da85401" }, { "fontloader-font-onr.lua", "a3f85c886cf22fb27760d98603d51ffd" }, { "fontloader-font-ocl.lua", "2a377351ae23c339764ec8ce2e8e9164" }, - { "fontloader-font-osd.lua", "c38c14c118680202c6f4b09734542c49" }, + { "fontloader-font-osd.lua", "837039b0dca88edd3f4b54222f7cf54c" }, { "fontloader-font-otc.lua", "0ad931eec679ebeceed5d4f02f4ba31b" }, - { "fontloader-font-ots.lua", "c039b20490b526ec469e41a8584ebe6d" }, + { "fontloader-font-ots.lua", "2ba92e909a45b68592f7271d8190f390" }, { "fontloader-font-ota.lua", "7407b709ae7b2cdf36f68d5c98d51d12" }, { "fontloader-font-oup.lua", "aaff9c28233bbea56e6d27ae50e04ff0" }, { "fontloader-font-otj.lua", "b2c165bd6771a57633f992d07384b739" }, - { "fontloader-font-oto.lua", "1cc20f34606fb55d4646a0dd323499ef" }, - { "fontloader-font-otl.lua", "21196d193ce16f3996c9aa75e81e440c" }, + { "fontloader-font-oto.lua", "b148d66f642aaa3d0ddc427f71d6e02d" }, + { "fontloader-font-otl.lua", "84499d355f82829841b8e304952a9d5d" }, { "fontloader-font-ott.lua", "427bdc77dd187158eafb79b7193400dc" }, { "fontloader-font-oti.lua", "309a75f9c14b77d87e94eba827dc4e71" }, - { "fontloader-font-dsp.lua", "755beef1b31e9dfd050e9d221d4e9ae3" }, + { "fontloader-font-dsp.lua", "d07a0663bafeb7603c5456639afaf2e8" }, { "fontloader-font-ttf.lua", "ff94e130d7c71edd899c4bae7745b7db" }, { "fontloader-font-cff.lua", "999da544079698ce70178fd84bcdd67a" }, { "fontloader-font-otr.lua", "2958a21bebcf0579f4e11f0646d1b402" }, { "fontloader-font-vfc.lua", "a81c29eda98cd62cbebdb6c93544b50d" }, - { "fontloader-font-map.lua", "27ee748150e56f5f0e5f0fefc864f35e" }, + { "fontloader-font-map.lua", "b1444428c238a17d2a998ff1a4769183" }, { "fontloader-font-cid.lua", "22b0367742fb253deef84ef7ccf5e8de" }, - { "fontloader-font-con.lua", "bdbaaa361308c9ccc0a7dac0bf6c17ec" }, + { "fontloader-font-con.lua", "ebdd0ca857deafdc0152c7a4f1ed2490" }, { "fontloader-font-ini.lua", "16b855c98602e4a3e9df39512916a427" }, { "fontloader-data-con.lua", "b4ab51aaeab872d86d827f3e216bf05e" }, - { "fontloader-reference.lua", "50f2268d2d34d5f2ad630151fc1e5b8e" }, + { "fontloader-reference.lua", "23d03b682af6417aa08995f2ec10de22" }, { "fontloader-basics-gen.lua", "4bc43036e9796fccb0b8869f4b05bf2e" }, { "mktests", "918cb50be9ee8bd645ac1a27dc501e8c" }, - { "mkstatus", "590e9cffec69376c1888aa78c5b9275e" }, + { "mkstatus", "201011fcb01d8d804cc27b69d184b1e5" }, { "mkcharacters", "bfca0e96e1e351afe7077502f9595af9" }, { "mkglyphlist", "7a8a8fdc0eac7fac2f13ec8f4e8e7aa9" }, { "mkimport", "7d62f1042e548f8b9368f26b9ba4be5c" }, - { "luaotfload-glyphlist.lua", "fa2a4b91221ca59a6af8ebf8f6d36092" }, + { "luaotfload-glyphlist.lua", "5b7427a864ba333f2f674b172bba2b63" }, { "luaotfload-characters.lua", "76415ca3ede312cad6e09038323489ae" }, - { "luaotfload-dvi.lua", "2c42e84f6c9cfdbe19bcc544f74bc3c8" }, - { "luaotfload-tounicode.lua", "c5b104d6d5d1d86f13d45294df8ac77f" }, - { "luaotfload-unicode.lua", "2ac5fb697191fbe7f30f4ab4e5f7037b" }, - { "luaotfload-resolvers.lua", "70abe38786679abb1ca55cc5911bba83" }, - { "luaotfload-parsers.lua", "72ab0dbd52fba0249530872bfde6163b" }, - { "luaotfload-fallback.lua", "653007bbe201edfe3d3841af3ec39b70" }, - { "luaotfload-szss.lua", "df7e044b32e6fa3105ebd7f31e5b03cf" }, - { "luaotfload-scripts.lua", "0d7bf2d895f46c408c26f23f5035affb" }, - { "luaotfload-multiscript.lua", "47e8a08c7271b9d660321631f3140a4c" }, - { "luaotfload-loaders.lua", "3acb9dc1e0f02d2ecee1ef144597caf6" }, - { "luaotfload-harf-plug.lua", "5274ff4eec2421572adbf4bf293fcd8c" }, - { "luaotfload-harf-define.lua", "0074c52e9baf538bfec8d4636552e466" }, - { "luaotfload-notdef.lua", "d1797bb1db42c691a1196a713c2e1936" }, - { "luaotfload-embolden.lua", "9b611178cd9acaa482f8be85f384d201" }, - { "luaotfload-letterspace.lua", "66348b58834d4cc954acd02bab149085" }, - { "luaotfload-features.lua", "23685ea0c4f4ba1adc4f9bdc467cfe34" }, - { "luaotfload-database.lua", "2c2ae0362806ef21ef2862326bc09c60" }, - { "luaotfload-configuration.lua", "34e76cd86a01213964c0f4d8b32c8858" }, - { "luaotfload-colors.lua", "1dadb911d3763a9517bc499d2652f431" }, - { "luaotfload-auxiliary.lua", "77787effc3f19842cd3df8641c1b1db5" }, - { "luaotfload-filelist.lua", "7a7aef4439461fa4b00231ac898abe82" }, - { "luaotfload-tool.lua", "6d582c12a960d475eeedf4dcd1ac5669" }, - { "luaotfload-diagnostics.lua", "4791249fede247e2c4346ab7f20d0d35" }, - { "luaotfload-log.lua", "dcd5da60663d042e45c60852b7edd23b" }, - { "luaotfload-init.lua", "2dc0709188f1ce7741f103949ebc9e67" }, + { "luaotfload-dvi.lua", "a88ce85492b935becf9de00d168b9fc6" }, + { "luaotfload-tounicode.lua", "834c7cb80bd7793c516187aa67a5dab8" }, + { "luaotfload-unicode.lua", "7559a279476f189206b248117d80f70d" }, + { "luaotfload-resolvers.lua", "aa07ed5021ce7bfb381ddd584910af6b" }, + { "luaotfload-parsers.lua", "eb862d8075e5e0b6130beed3f89f29be" }, + { "luaotfload-fallback.lua", "49bc7a9f026fd23e13cd1b4be30be43c" }, + { "luaotfload-szss.lua", "b174020a2eb6021e0b8838f0ad4f0fe4" }, + { "luaotfload-scripts.lua", "cf7669cbc2e1585e5e9f63b2ebef5a0f" }, + { "luaotfload-multiscript.lua", "478c8afcc416be47c861474a3b64096b" }, + { "luaotfload-loaders.lua", "178c47e50037b1455c29b10a826b8ebc" }, + { "luaotfload-harf-plug.lua", "eb202ef8123cf63e6d4820452391697f" }, + { "luaotfload-harf-define.lua", "5723873002793c7ea723c8f1abfc412d" }, + { "luaotfload-notdef.lua", "ffae44eac263adc9e7b6c5f6373637ed" }, + { "luaotfload-embolden.lua", "85ef9409937b25da3f3f4bbb0d72cebc" }, + { "luaotfload-letterspace.lua", "b608dac037f4b173833eac25d205ed91" }, + { "luaotfload-features.lua", "b43dedff88145a0626bdfcb77f8791ee" }, + { "luaotfload-database.lua", "d92cce26908694dbbb30232252e12f80" }, + { "luaotfload-configuration.lua", "84379ea613f7e55c07f17b55b9dfb67b" }, + { "luaotfload-colors.lua", "89386fcb44e2887b1be60b8acbe251b3" }, + { "luaotfload-auxiliary.lua", "a43134987a5cf7fc22bfd240745440fe" }, + { "luaotfload-filelist.lua", "e40105831b58e5f0fa4908a7a131da1f" }, + { "luaotfload-tool.lua", "89fc6f4c6e2630305a91dd6a29c1449d" }, + { "luaotfload-diagnostics.lua", "7e07c0b2d9470c016d72d36900904792" }, + { "luaotfload-log.lua", "e008c6135446dff77813079ce11a10e8" }, + { "luaotfload-init.lua", "9f354ea115993d9a9238d5f74c7d7e63" }, { "luaotfload-main.lua", "b19c9cc34cf1d676c39f872cfb41aef6" }, }, ["notes"]={ ["committer"]="Marcel Fabian Krüger <tex@2krueger.de>", - ["description"]="v3.26/2023-08-31", - ["loader"]="fontloader-2023-08-19.lua", - ["revision"]="dc84dc80eeefae198d20f414ce1a3547f721446e", - ["timestamp"]="2023-08-31 20:10:15 +0200", + ["description"]="v3.27/2024-02-14", + ["loader"]="fontloader-2023-12-28.lua", + ["revision"]="17a160cd9eacf04cb179e7405f2d616824314868", + ["timestamp"]="2024-02-14 22:31:40 +0100", }, }
\ No newline at end of file diff --git a/macros/luatex/generic/luaotfload/luaotfload-suppress.lua b/macros/luatex/generic/luaotfload/luaotfload-suppress.lua index c9fcfc8c2e..1df46db80b 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-suppress.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-suppress.lua @@ -5,8 +5,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-suppress", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / suppress", license = "GPL v2.0", author = "Marcel Krüger" diff --git a/macros/luatex/generic/luaotfload/luaotfload-szss.lua b/macros/luatex/generic/luaotfload/luaotfload-szss.lua index 95ac6b4d08..c01d271d59 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-szss.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-szss.lua @@ -5,8 +5,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-szss", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / Special feature handling", license = "GPL v2.0", author = "Marcel Krüger" diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.1 b/macros/luatex/generic/luaotfload/luaotfload-tool.1 index cd100af1f0..1334d48da9 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-tool.1 +++ b/macros/luatex/generic/luaotfload/luaotfload-tool.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH LUAOTFLOAD-TOOL 1 "2023-08-31" "3.26" "text processing" +.TH LUAOTFLOAD-TOOL 1 "2024-02-14" "3.27" "text processing" .SH NAME luaotfload-tool \- generate and query the Luaotfload font names database . diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.lua b/macros/luatex/generic/luaotfload/luaotfload-tool.lua index 9eeed6dc2c..45517448e7 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-tool.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-tool.lua @@ -9,8 +9,8 @@ local ProvidesLuaModule = { name = "luaotfload-tool", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload-tool / database functionality", license = "GPL v2.0" } diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.pdf b/macros/luatex/generic/luaotfload/luaotfload-tool.pdf Binary files differindex e1a613e4b1..b87a1914e0 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-tool.pdf +++ b/macros/luatex/generic/luaotfload/luaotfload-tool.pdf diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.rst b/macros/luatex/generic/luaotfload/luaotfload-tool.rst index 6ef9270430..778bbf5f1b 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-tool.rst +++ b/macros/luatex/generic/luaotfload/luaotfload-tool.rst @@ -6,9 +6,9 @@ generate and query the Luaotfload font names database ----------------------------------------------------------------------- -:Date: 2023-08-31 +:Date: 2024-02-14 :Copyright: GPL v2.0 -:Version: 3.26 +:Version: 3.27 :Manual section: 1 :Manual group: text processing diff --git a/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua b/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua index 00496d9ea8..c0d7046689 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua @@ -5,8 +5,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-tounicode", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / tounicode", license = "GPL v2.0", author = "Hans Hagen, Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger", diff --git a/macros/luatex/generic/luaotfload/luaotfload-unicode.lua b/macros/luatex/generic/luaotfload/luaotfload-unicode.lua index 975813d468..b83ac25461 100644 --- a/macros/luatex/generic/luaotfload/luaotfload-unicode.lua +++ b/macros/luatex/generic/luaotfload/luaotfload-unicode.lua @@ -5,8 +5,8 @@ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") { name = "luaotfload-unicode", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "luaotfload submodule / Unicode helpers", license = "CC0 1.0 Universal", author = "Marcel Krüger" diff --git a/macros/luatex/generic/luaotfload/luaotfload.conf.5 b/macros/luatex/generic/luaotfload/luaotfload.conf.5 index 457025497e..3ebd68b72a 100644 --- a/macros/luatex/generic/luaotfload/luaotfload.conf.5 +++ b/macros/luatex/generic/luaotfload/luaotfload.conf.5 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH LUAOTFLOAD.CONF 5 "2023-08-31" "3.26" "text processing" +.TH LUAOTFLOAD.CONF 5 "2024-02-14" "3.27" "text processing" .SH NAME luaotfload.conf \- Luaotfload configuration file . diff --git a/macros/luatex/generic/luaotfload/luaotfload.conf.rst b/macros/luatex/generic/luaotfload/luaotfload.conf.rst index 877699a404..f9e48cb7a2 100644 --- a/macros/luatex/generic/luaotfload/luaotfload.conf.rst +++ b/macros/luatex/generic/luaotfload/luaotfload.conf.rst @@ -6,9 +6,9 @@ Luaotfload configuration file ----------------------------------------------------------------------- -:Date: 2023-08-31 +:Date: 2024-02-14 :Copyright: GPL v2.0 -:Version: 3.26 +:Version: 3.27 :Manual section: 5 :Manual group: text processing diff --git a/macros/luatex/generic/luaotfload/luaotfload.lua b/macros/luatex/generic/luaotfload/luaotfload.lua index 798fa8d45f..893309f9db 100644 --- a/macros/luatex/generic/luaotfload/luaotfload.lua +++ b/macros/luatex/generic/luaotfload/luaotfload.lua @@ -20,8 +20,8 @@ local authors = "\z -- version number is used below! local ProvidesLuaModule = { name = "luaotfload", - version = "3.26", --TAGVERSION - date = "2023-08-31", --TAGDATE + version = "3.27", --TAGVERSION + date = "2024-02-14", --TAGDATE description = "Lua based OpenType font support", author = authors, copyright = authors, diff --git a/macros/luatex/generic/luaotfload/luaotfload.sty b/macros/luatex/generic/luaotfload/luaotfload.sty index c68e171cbc..262834e95c 100644 --- a/macros/luatex/generic/luaotfload/luaotfload.sty +++ b/macros/luatex/generic/luaotfload/luaotfload.sty @@ -39,7 +39,7 @@ \fi \ifdefined\ProvidesPackage \ProvidesPackage{luaotfload}% - [2023/08/31 v3.26 OpenType layout system] + [2024/02/14 v3.27 OpenType layout system] \fi \directlua{ if xpcall(function ()% diff --git a/macros/luatex/generic/luaotfload/scripts-demo.pdf b/macros/luatex/generic/luaotfload/scripts-demo.pdf Binary files differindex ab6d26d476..0049165b55 100644 --- a/macros/luatex/generic/luaotfload/scripts-demo.pdf +++ b/macros/luatex/generic/luaotfload/scripts-demo.pdf diff --git a/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf b/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf Binary files differindex 129ca94725..d46132c76e 100644 --- a/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf +++ b/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf diff --git a/macros/luatex/generic/luaotfload/shaper-demo.pdf b/macros/luatex/generic/luaotfload/shaper-demo.pdf Binary files differindex 01f952dcca..3ad7f54fa1 100644 --- a/macros/luatex/generic/luaotfload/shaper-demo.pdf +++ b/macros/luatex/generic/luaotfload/shaper-demo.pdf diff --git a/macros/xetex/latex/exam-zh/CHANGELOG.md b/macros/xetex/latex/exam-zh/CHANGELOG.md index cd4627352f..9bc3a3c0d6 100644 --- a/macros/xetex/latex/exam-zh/CHANGELOG.md +++ b/macros/xetex/latex/exam-zh/CHANGELOG.md @@ -5,6 +5,14 @@ 格式参照 [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 并且此项目遵守 [Semantic Versioning](https://semver.org/spec/v2.0.0.html)。 + +## [0.2.1] - 2024-02-15 + +### Fixed + +- 更改手册的一处笔误 + + ## [0.2.1] - 2024-02-11 ### Added diff --git a/macros/xetex/latex/exam-zh/doc/body/usage.tex b/macros/xetex/latex/exam-zh/doc/body/usage.tex index 85566213f4..ce7bc7f8ba 100644 --- a/macros/xetex/latex/exam-zh/doc/body/usage.tex +++ b/macros/xetex/latex/exam-zh/doc/body/usage.tex @@ -2267,9 +2267,9 @@ \begin{function}[added = 2022-07-01,updated = 2024-02-11]{solution/show-solution} \begin{ccnusyntax}[emph={[1]show-solution}] - show-solution = (*<(show-hide)|show-stay|show-move>*) + show-solution = (*<(hide)|show-stay|show-move>*) \end{ccnusyntax} - 是否显示或移动解答环境 \env{solution} 的内容。\opt{show-hide} 表示隐藏,\opt{show-stay} 表示显示在原处,\opt{show-move} 表示显示在章节最后。 + 是否显示或移动解答环境 \env{solution} 的内容。\opt{hide} 表示隐藏,\opt{show-stay} 表示显示在原处,\opt{show-move} 表示显示在章节最后。 \end{function} \begin{function}[added = 2022-07-20]{solution/parbreak} diff --git a/macros/xetex/latex/exam-zh/doc/exam-zh-doc-setup.tex b/macros/xetex/latex/exam-zh/doc/exam-zh-doc-setup.tex index d67b599cee..45b5d5a6e7 100644 --- a/macros/xetex/latex/exam-zh/doc/exam-zh-doc-setup.tex +++ b/macros/xetex/latex/exam-zh/doc/exam-zh-doc-setup.tex @@ -35,7 +35,7 @@ \textbf{exam-zh: 中国试卷 \LaTeX \xpinyin[font=\sffamily,format=\color{MaterialIndigo800}]{模}{mu2}板}}} \author{% 夏康玮\thanks{% - 李泽平构建了 \cls{exam-zh} 的最初的基本框架;郭李军开发了连线题环境} + 李泽平构建了 \cls{exam-zh} 的最初的基本框架;张庭瑄开发 \cls{exam-zh-font} 模块;郭李军开发了连线题环境} } \date{\DocDate\quad \DocVersion% \thanks{% diff --git a/macros/xetex/latex/exam-zh/doc/exam-zh-doc.pdf b/macros/xetex/latex/exam-zh/doc/exam-zh-doc.pdf Binary files differindex 734be0a38f..447e58ab3c 100644 --- a/macros/xetex/latex/exam-zh/doc/exam-zh-doc.pdf +++ b/macros/xetex/latex/exam-zh/doc/exam-zh-doc.pdf diff --git a/macros/xetex/latex/exam-zh/doc/exam-zh-doc.tex b/macros/xetex/latex/exam-zh/doc/exam-zh-doc.tex index 6beca867a6..83c6d8352d 100644 --- a/macros/xetex/latex/exam-zh/doc/exam-zh-doc.tex +++ b/macros/xetex/latex/exam-zh/doc/exam-zh-doc.tex @@ -1,6 +1,6 @@ \documentclass{xdyydoc} -\newcommand{\DocDate}{2024-02-11} +\newcommand{\DocDate}{2024-02-15} \newcommand{\DocVersion}{v0.2.1} \input{exam-zh-doc-setup.tex} \usepackage{amssymb} @@ -57,46 +57,46 @@ -\section{\cls{exam-zh}:TODO} - -\begin{itemize} - % \item 增加试卷范例(语文,英语) - % \item 答案控制 - % \begin{itemize} - % \item 选择题 - % \begin{itemize} - % \item 题目下方 - % \item 括号内 - % \item 最后:列表形式、表格形式 - % \end{itemize} - % \item 填空题 - % \begin{itemize} - % \item 题目下方 - % \item 划线内 - % \item 最后 - % \end{itemize} - % \item 解答题 - % \begin{itemize} - % \item 题目下方 - % \item 移动到最后 - % \end{itemize} - % \end{itemize} - \item 选择题答案标记 - % \item \env{choices} 环境“均分”效果 - % \item 图文排版(参考 xkwxdyy 的 \pkg{text-figure} 宏包和 qinglee 的 \pkg{wrapstuff} 宏包) - \item 测试兼容性 - \item \env{question} 环境的引用 - \item \tn{fillin} 的进一步优化 - \begin{itemize} - \item 根据答案的宽度留白 - \item \tn{fillin*} 的基线能否自动调整 - \end{itemize} - \item 每个子包设置用户接口 - \item 通过 \tn{CJKunderline} 的 \meta{hidden} 键实现 \tn{fillin} 的无答案的时候,长度是答案的长度 - \item \env{poem} 环境的引用字体不是斜体 - \item 用 meta 优化键值,比如统一的 show-answer - \item 设置 \tn{vec} 命令的定制开关。 -\end{itemize} +% \section{\cls{exam-zh}:TODO} + +% \begin{itemize} +% % \item 增加试卷范例(语文,英语) +% % \item 答案控制 +% % \begin{itemize} +% % \item 选择题 +% % \begin{itemize} +% % \item 题目下方 +% % \item 括号内 +% % \item 最后:列表形式、表格形式 +% % \end{itemize} +% % \item 填空题 +% % \begin{itemize} +% % \item 题目下方 +% % \item 划线内 +% % \item 最后 +% % \end{itemize} +% % \item 解答题 +% % \begin{itemize} +% % \item 题目下方 +% % \item 移动到最后 +% % \end{itemize} +% % \end{itemize} +% \item 选择题答案标记 +% % \item \env{choices} 环境“均分”效果 +% % \item 图文排版(参考 xkwxdyy 的 \pkg{text-figure} 宏包和 qinglee 的 \pkg{wrapstuff} 宏包) +% \item 测试兼容性 +% \item \env{question} 环境的引用 +% \item \tn{fillin} 的进一步优化 +% \begin{itemize} +% \item 根据答案的宽度留白 +% \item \tn{fillin*} 的基线能否自动调整 +% \end{itemize} +% \item 每个子包设置用户接口 +% \item 通过 \tn{CJKunderline} 的 \meta{hidden} 键实现 \tn{fillin} 的无答案的时候,长度是答案的长度 +% \item \env{poem} 环境的引用字体不是斜体 +% \item 用 meta 优化键值,比如统一的 show-answer +% \item 设置 \tn{vec} 命令的定制开关。 +% \end{itemize} \end{document}
\ No newline at end of file diff --git a/macros/xetex/latex/exam-zh/examples/example-multiple.pdf b/macros/xetex/latex/exam-zh/examples/example-multiple.pdf Binary files differindex 29b1dc4883..3d92145547 100644 --- a/macros/xetex/latex/exam-zh/examples/example-multiple.pdf +++ b/macros/xetex/latex/exam-zh/examples/example-multiple.pdf diff --git a/macros/xetex/latex/exam-zh/examples/example-single.pdf b/macros/xetex/latex/exam-zh/examples/example-single.pdf Binary files differindex 1ecd7749c5..1a5cba4d3d 100644 --- a/macros/xetex/latex/exam-zh/examples/example-single.pdf +++ b/macros/xetex/latex/exam-zh/examples/example-single.pdf diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh-chinese-english.sty b/macros/xetex/latex/exam-zh/tex/exam-zh-chinese-english.sty index 845eabfca1..373f9a5e10 100644 --- a/macros/xetex/latex/exam-zh/tex/exam-zh-chinese-english.sty +++ b/macros/xetex/latex/exam-zh/tex/exam-zh-chinese-english.sty @@ -1,5 +1,5 @@ % -% Copyright (c) 2022 Kangwei Xia, Lijun Guo +% Copyright (c) 2024 Kangwei Xia, Lijun Guo % Released under the LaTeX Project Public License v1.3c License. % Repository: https://gitee.com/xkwxdyy/exam-zh % @@ -8,7 +8,7 @@ \RequirePackage{expl3} -\ProvidesExplPackage {exam-zh-chinese-english} {2024-02-11} {v0.2.1} +\ProvidesExplPackage {exam-zh-chinese-english} {2024-02-15} {v0.2.1} {exam-zh chinese and english module} \PassOptionsToPackage { tcolorbox } { most } diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty b/macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty index b66f974d2b..3b1eea9cb5 100644 --- a/macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty +++ b/macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty @@ -1,5 +1,5 @@ % -% Copyright (c) 2022 Zeping Lee +% Copyright (c) 2024 Zeping Lee % Released under the LaTeX Project Public License v1.3c License. % Repository: https://gitee.com/xkwxdyy/exam-zh % @@ -9,7 +9,7 @@ \RequirePackage{expl3} \RequirePackage{xparse} -\ProvidesExplPackage {exam-zh-choices} {2024-02-11} {v0.2.1} +\ProvidesExplPackage {exam-zh-choices} {2024-02-15} {v0.2.1} {exam-zh choices module} \dim_new:N \l__examzh_choices_column_sep_dim diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh-font.sty b/macros/xetex/latex/exam-zh/tex/exam-zh-font.sty index 85f7bb1782..cec5e24428 100644 --- a/macros/xetex/latex/exam-zh/tex/exam-zh-font.sty +++ b/macros/xetex/latex/exam-zh/tex/exam-zh-font.sty @@ -1,5 +1,5 @@ % -% Copyright (c) 2022 Zeping Lee and AlphaZTX +% Copyright (c) 2024 Zeping Lee and AlphaZTX % Released under the LaTeX Project Public License v1.3c License. % Repository: https://gitee.com/xkwxdyy/exam-zh % @@ -9,7 +9,7 @@ \RequirePackage{expl3} \RequirePackage{xparse} -\ProvidesExplPackage {exam-zh-font} {2024-02-11} {v0.2.1} +\ProvidesExplPackage {exam-zh-font} {2024-02-15} {v0.2.1} {exam-zh font module} \RequirePackage { unicode-math } diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh-math.sty b/macros/xetex/latex/exam-zh/tex/exam-zh-math.sty index e11281f077..6ced1e6bcd 100644 --- a/macros/xetex/latex/exam-zh/tex/exam-zh-math.sty +++ b/macros/xetex/latex/exam-zh/tex/exam-zh-math.sty @@ -1,5 +1,5 @@ % -% Copyright (c) 2022 Kangwei Xia +% Copyright (c) 2024 Kangwei Xia % Released under the LaTeX Project Public License v1.3c License. % Repository: https://gitee.com/xkwxdyy/exam-zh % @@ -8,7 +8,7 @@ \RequirePackage{expl3} -\ProvidesExplPackage {exam-zh-math} {2024-02-11} {v0.2.1} +\ProvidesExplPackage {exam-zh-math} {2024-02-15} {v0.2.1} {exam-zh math module} \RequirePackage { tabularray } diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh-question.sty b/macros/xetex/latex/exam-zh/tex/exam-zh-question.sty index 8fae81e43e..f7830978ff 100644 --- a/macros/xetex/latex/exam-zh/tex/exam-zh-question.sty +++ b/macros/xetex/latex/exam-zh/tex/exam-zh-question.sty @@ -1,5 +1,5 @@ % -% Copyright (c) 2022 Zeping Lee +% Copyright (c) 2024 Zeping Lee % Released under the LaTeX Project Public License v1.3c License. % Repository: https://gitee.com/xkwxdyy/exam-zh % @@ -9,7 +9,7 @@ \RequirePackage{expl3} \RequirePackage{xparse} -\ProvidesExplPackage {exam-zh-question} {2024-02-11} {v0.2.1} +\ProvidesExplPackage {exam-zh-question} {2024-02-15} {v0.2.1} {exam-zh question module} diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh-symbols.sty b/macros/xetex/latex/exam-zh/tex/exam-zh-symbols.sty index cce55928f6..9a3a7825e6 100644 --- a/macros/xetex/latex/exam-zh/tex/exam-zh-symbols.sty +++ b/macros/xetex/latex/exam-zh/tex/exam-zh-symbols.sty @@ -1,5 +1,5 @@ % -% Copyright (c) 2022 Kangwei Xia +% Copyright (c) 2024 Kangwei Xia % Released under the LaTeX Project Public License v1.3c License. % Repository: https://gitee.com/xkwxdyy/exam-zh % @@ -8,7 +8,7 @@ \RequirePackage{expl3} -\ProvidesExplPackage {exam-zh-symbols} {2024-02-11} {v0.2.1} +\ProvidesExplPackage {exam-zh-symbols} {2024-02-15} {v0.2.1} {exam-zh symbols module} \RequirePackage { tikz } diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh-textfigure.sty b/macros/xetex/latex/exam-zh/tex/exam-zh-textfigure.sty index 656617da98..9aec00838d 100644 --- a/macros/xetex/latex/exam-zh/tex/exam-zh-textfigure.sty +++ b/macros/xetex/latex/exam-zh/tex/exam-zh-textfigure.sty @@ -1,5 +1,5 @@ % -% Copyright (c) 2022 Kangwei Xia +% Copyright (c) 2024 Kangwei Xia % Released under the LaTeX Project Public License v1.3c License. % Repository: https://gitee.com/xkwxdyy/exam-zh % @@ -7,7 +7,7 @@ \RequirePackage{expl3} -\ProvidesExplPackage {exam-zh-textfigure} {2024-02-11} {v0.2.1} +\ProvidesExplPackage {exam-zh-textfigure} {2024-02-15} {v0.2.1} {exam-zh text with figure module} diff --git a/macros/xetex/latex/exam-zh/tex/exam-zh.cls b/macros/xetex/latex/exam-zh/tex/exam-zh.cls index e4ba177bec..2af3a8fc93 100644 --- a/macros/xetex/latex/exam-zh/tex/exam-zh.cls +++ b/macros/xetex/latex/exam-zh/tex/exam-zh.cls @@ -1,12 +1,12 @@ % -% Copyright (c) 2022 Zeping Lee +% Copyright (c) 2024 Zeping Lee % Released under the LaTeX Project Public License v1.3c License. % Repository: https://gitee.com/xkwxdyy/exam-zh % \NeedsTeXFormat{LaTeX2e}[2017/04/15] \RequirePackage{expl3} -\ProvidesExplClass {exam-zh} {2024-02-11} {v0.2.1} {LaTeX template for Chinese exam} +\ProvidesExplClass {exam-zh} {2024-02-15} {v0.2.1} {LaTeX template for Chinese exam} % 检查 LaTeX2e kernel 版本 \msg_new:nnn { exam-zh } { latex-too-old } |