From 5d31142615a7efaf833be860e412995b42bf9c3c Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Fri, 21 Oct 2022 21:37:10 +0200 Subject: 2022-10-21 21:13:00 --- .../manuals/luametatex/luametatex-enhancements.tex | 9 +- .../general/manuals/luametatex/luametatex-math.tex | 8 +- scripts/context/lua/mtx-install.lua | 5 + source/luametatex/CMakeLists.txt | 4 +- source/luametatex/source/lua/lmtinterface.h | 2 - source/luametatex/source/lua/lmtnodelib.c | 4 +- source/luametatex/source/lua/lmttexlib.c | 69 +- source/luametatex/source/lua/lmttokenlib.c | 110 ++-- source/luametatex/source/lua/lmttokenlib.h | 2 +- .../luametatex/source/luacore/lua54/src/ltable.c | 4 +- source/luametatex/source/luametatex.h | 6 +- source/luametatex/source/tex/texequivalents.c | 2 +- source/luametatex/source/tex/texexpand.c | 2 +- source/luametatex/source/tex/texfileio.c | 4 +- source/luametatex/source/tex/texlanguage.c | 4 +- source/luametatex/source/tex/texlinebreak.c | 4 +- source/luametatex/source/tex/texmaincontrol.c | 23 +- source/luametatex/source/tex/texmath.c | 32 - source/luametatex/source/tex/texmath.h | 4 - source/luametatex/source/tex/texprimitive.c | 14 +- source/luametatex/source/tex/texprinting.c | 40 +- source/luametatex/source/tex/texscanning.c | 15 +- source/luametatex/source/tex/texstringpool.c | 18 + source/luametatex/source/tex/texstringpool.h | 64 +- source/luametatex/source/tex/textoken.c | 26 +- source/luametatex/source/tex/textoken.h | 8 +- source/luametatex/source/utilities/auxunistring.c | 5 +- tex/context/base/mkii/cont-new.mkii | 2 +- tex/context/base/mkii/context.mkii | 2 +- tex/context/base/mkii/mult-cs.mkii | 5 +- tex/context/base/mkii/mult-it.mkii | 1 + tex/context/base/mkiv/char-ini.lua | 36 +- tex/context/base/mkiv/cont-new.mkiv | 2 +- tex/context/base/mkiv/context.mkiv | 2 +- tex/context/base/mkiv/font-con.lua | 1 - tex/context/base/mkiv/font-ctx.lua | 4 +- tex/context/base/mkiv/font-imp-italics.lua | 49 +- tex/context/base/mkiv/font-imp-math.lua | 74 +-- tex/context/base/mkiv/font-pre.mkiv | 7 +- tex/context/base/mkiv/good-mth.lua | 510 ++++++++------- tex/context/base/mkiv/lpdf-ano.lua | 4 + tex/context/base/mkiv/math-act.lua | 436 ++++++------- tex/context/base/mkiv/math-vfu.lua | 2 +- tex/context/base/mkiv/scrn-ini.lua | 8 + tex/context/base/mkiv/scrn-ini.mkvi | 4 + tex/context/base/mkiv/status-files.pdf | Bin 24586 -> 24598 bytes tex/context/base/mkiv/status-lua.pdf | Bin 263077 -> 263133 bytes tex/context/base/mkiv/strc-lst.lua | 7 +- tex/context/base/mkxl/cont-new.mkxl | 2 +- tex/context/base/mkxl/context.mkxl | 2 +- tex/context/base/mkxl/driv-ini.lmt | 4 +- tex/context/base/mkxl/font-col.mklx | 18 +- tex/context/base/mkxl/font-con.lmt | 8 +- tex/context/base/mkxl/font-ctx.lmt | 134 ++-- tex/context/base/mkxl/font-imp-math.lmt | 97 ++- tex/context/base/mkxl/font-ini.mklx | 66 +- tex/context/base/mkxl/font-lib.mklx | 12 + tex/context/base/mkxl/font-pre.mkxl | 22 +- tex/context/base/mkxl/lpdf-ano.lmt | 4 + tex/context/base/mkxl/math-act.lmt | 703 +++++++++++---------- tex/context/base/mkxl/math-ini.mkxl | 26 +- tex/context/base/mkxl/math-vfu.lmt | 8 +- tex/context/base/mkxl/mlib-int.lmt | 117 ++-- tex/context/base/mkxl/node-ali.lmt | 4 +- tex/context/base/mkxl/scrn-ini.lmt | 8 + tex/context/base/mkxl/scrn-ini.mklx | 4 + tex/context/base/mkxl/tabl-ntb.mkxl | 3 +- tex/context/base/mkxl/trac-vis.lmt | 11 +- tex/context/base/mkxl/type-imp-euler.mkxl | 67 ++ tex/context/base/mkxl/typo-itc.lmt | 3 +- tex/context/fonts/mkiv/asana-math.lfg | 86 +-- tex/context/fonts/mkiv/bonum-math.lfg | 389 +++++------- tex/context/fonts/mkiv/cambria-math.lfg | 145 ++--- tex/context/fonts/mkiv/common-math.lfg | 174 ++++- tex/context/fonts/mkiv/concrete-math.lfg | 22 +- tex/context/fonts/mkiv/dejavu-math.lfg | 60 +- tex/context/fonts/mkiv/erewhon-math.lfg | 25 +- tex/context/fonts/mkiv/euler-math.lfg | 114 +++- tex/context/fonts/mkiv/garamond-math.lfg | 231 +++---- tex/context/fonts/mkiv/generic-math.lfg | 27 +- tex/context/fonts/mkiv/kpfonts-math.lfg | 23 +- tex/context/fonts/mkiv/libertinus-math.lfg | 111 ++-- tex/context/fonts/mkiv/lm.lfg | 520 ++++++--------- tex/context/fonts/mkiv/lucida-opentype-math.lfg | 129 ++-- tex/context/fonts/mkiv/minion-math.lfg | 48 +- tex/context/fonts/mkiv/pagella-math.lfg | 167 +++-- tex/context/fonts/mkiv/schola-math.lfg | 42 +- tex/context/fonts/mkiv/stix-two-math.lfg | 60 +- tex/context/fonts/mkiv/termes-math.lfg | 91 ++- tex/context/fonts/mkiv/type-imp-minion.mkiv | 12 +- tex/context/fonts/mkiv/xits-math.lfg | 45 +- tex/context/interface/mkii/keys-cs.xml | 5 +- tex/context/interface/mkii/keys-it.xml | 1 + tex/generic/context/luatex/luatex-fonts-merged.lua | 23 +- tex/generic/context/luatex/luatex-math.lua | 154 ++++- 95 files changed, 2929 insertions(+), 2742 deletions(-) create mode 100644 tex/context/base/mkxl/type-imp-euler.mkxl diff --git a/doc/context/sources/general/manuals/luametatex/luametatex-enhancements.tex b/doc/context/sources/general/manuals/luametatex/luametatex-enhancements.tex index ca3759926..cb7a990da 100644 --- a/doc/context/sources/general/manuals/luametatex/luametatex-enhancements.tex +++ b/doc/context/sources/general/manuals/luametatex/luametatex-enhancements.tex @@ -257,10 +257,11 @@ the \UNICODE\ input is on purpose not built|-|in and can be handled by a macro package during callback processing. We have made some practical choices and the user has to live with those. -Output in byte|-|sized chunks can be achieved by using characters just outside of -the valid \UNICODE\ range, starting at the value $1{,}114{,}112$ (0x110000). When -the time comes to print a character $c>=1{,}114{,}112$, \LUATEX\ will actually -print the single byte corresponding to $c$ minus 1{,}114{,}112. +% Output in byte|-|sized chunks can be achieved by using characters just outside of +% the valid \UNICODE\ range, starting at the value $1{,}114{,}112$ (0x110000). When +% the time comes to print a character $c>=1{,}114{,}112$, \LUATEX\ will actually +% print the single byte corresponding to $c$ minus 1{,}114{,}112. This feature has +% been dropped. Contrary to other \TEX\ engines, the output to the terminal is as|-|is so there is no escaping with \type {^^}. We operate in a \UTF\ universe. Because we diff --git a/doc/context/sources/general/manuals/luametatex/luametatex-math.tex b/doc/context/sources/general/manuals/luametatex/luametatex-math.tex index d7bd50eea..88d3eafc3 100644 --- a/doc/context/sources/general/manuals/luametatex/luametatex-math.tex +++ b/doc/context/sources/general/manuals/luametatex/luametatex-math.tex @@ -1022,12 +1022,12 @@ undefined will get presets, quite likely zero): \NC \prm {Umathaccentbasedepth} \NC the complement of \prm {Umathaccentbaseheight} \NC \NR \NC \prm {Umathflattenedaccentbasedepth} \NC the complement of \prm {Umathflattenedaccentbaseheight} \NC \NR \NC \prm {Umathspacebeforescript} \NC \NC \NR -\NC \prm {Umathraisepercent} \NC the percentage that the vertical position is scaled \NC \NR +\NC \prm {Umathprimeraise} \NC \NC \NR +\NC \prm {Umathprimeraisecomposed} \NC \NC \NR \NC \prm {Umathprimeshiftup} \NC the prime variant of \prm {Umathsupshiftup} \NC \NR -\NC \prm {Umathprimeshiftupcramped} \NC the prime variant of \prm {Umathsupshiftup} \NC \NR \NC \prm {Umathprimespaceafter} \NC the prescript variant of \prm {Umathspaceafterscript} \NC \NR -\NC \prm {Umathprimebaselinedropmax} \NC the prime variant of \prm {Umathsupshiftdrop} \NC \NR -\NC \prm {Umathprimewidthpercent} \NC the percentage of width that gets added \NC \NR +\NC \prm {Umathprimeshiftdrop} \NC the prime variant of \prm {Umathsupshiftdrop} \NC \NR +\NC \prm {Umathprimewidth} \NC the percentage of width that gets added \NC \NR \NC \prm {Umathskeweddelimitertolerance} \NC \NC \NR \NC \prm {Umathaccenttopshiftup} \NC the amount that a top accent is shifted up \NC \NR \NC \prm {Umathaccentbottomshiftdown} \NC the amount that a bottom accent is shifted down \NC \NR diff --git a/scripts/context/lua/mtx-install.lua b/scripts/context/lua/mtx-install.lua index 676e6cad5..1eb7e88c9 100644 --- a/scripts/context/lua/mtx-install.lua +++ b/scripts/context/lua/mtx-install.lua @@ -618,6 +618,11 @@ function install.update() end run("%s --make en", contextbin) + -- in case we also install luatex: + + run("%s --luatex --generate",contextbin) + run("%s --luatex --make en", contextbin) + -- in calling script: update mtxrun.exe and mtxrun.lua report("") diff --git a/source/luametatex/CMakeLists.txt b/source/luametatex/CMakeLists.txt index d972a0312..a5021595f 100644 --- a/source/luametatex/CMakeLists.txt +++ b/source/luametatex/CMakeLists.txt @@ -205,8 +205,8 @@ if (DEFINED LMT_OPTIMIZE) # set_property(TARGET luametatex PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) # # mingw64: 2865664, nocona: 2819584, lto: 2835968 (around 1% gain on manual) - - set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) + # + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) # else() # No message needed, just accept the fact. diff --git a/source/luametatex/source/lua/lmtinterface.h b/source/luametatex/source/lua/lmtinterface.h index 3fd87db2f..e761252a8 100644 --- a/source/luametatex/source/lua/lmtinterface.h +++ b/source/luametatex/source/lua/lmtinterface.h @@ -865,9 +865,7 @@ make_lua_key(L, match);\ make_lua_key(L, math);\ make_lua_key(L, mathspec);\ make_lua_key(L, math_accent);\ -make_lua_key(L, math_char_given);\ make_lua_key(L, math_char_number);\ -make_lua_key(L, math_char_xgiven);\ make_lua_key(L, math_choice);\ make_lua_key(L, math_component);\ make_lua_key(L, math_fence);\ diff --git a/source/luametatex/source/lua/lmtnodelib.c b/source/luametatex/source/lua/lmtnodelib.c index 7d9d7bcbe..eb29611e2 100644 --- a/source/luametatex/source/lua/lmtnodelib.c +++ b/source/luametatex/source/lua/lmtnodelib.c @@ -2997,7 +2997,7 @@ static int nodelib_direct_getdata(lua_State *L) } case mark_node: if (lua_toboolean(L, 2)) { - lmt_token_list_to_luastring(L, mark_ptr(n), 0, 0); + lmt_token_list_to_luastring(L, mark_ptr(n), 0, 0, 0); } else { lmt_token_list_to_lua(L, mark_ptr(n)); } @@ -6555,7 +6555,7 @@ static int nodelib_common_getfield(lua_State *L, int direct, halfword n) lua_pushinteger(L, mark_index(n)); } else if (lua_key_eq(s, data) || lua_key_eq(s, mark)) { if (lua_toboolean(L, 3)) { - lmt_token_list_to_luastring(L, mark_ptr(n), 0, 0); + lmt_token_list_to_luastring(L, mark_ptr(n), 0, 0, 0); } else { lmt_token_list_to_lua(L, mark_ptr(n)); } diff --git a/source/luametatex/source/lua/lmttexlib.c b/source/luametatex/source/lua/lmttexlib.c index d44127330..afafb068b 100644 --- a/source/luametatex/source/lua/lmttexlib.c +++ b/source/luametatex/source/lua/lmttexlib.c @@ -1715,10 +1715,9 @@ static int texlib_gettoks(lua_State *L) if (lua_toboolean(L, slot)) { lmt_token_register_to_lua(L, state ? toks_parameter(index) : toks_register(index)); } else { + strnumber value = tex_get_tex_toks_register(index, state); - char *s = tex_makecstring(value); - lua_pushstring(L, s); - lmt_memory_free(s); + lua_pushstring(L, tex_to_cstring(value)); tex_flush_str(value); } } else { @@ -1754,7 +1753,7 @@ static int texlib_getmark(lua_State *L) if (num >= 0 && num <= lmt_mark_state.mark_data.ptr) { halfword ptr = tex_get_some_mark(mrk, num); if (ptr) { - char *str = tex_tokenlist_to_tstring(ptr, 1, NULL, 0, 0, 0); + char *str = tex_tokenlist_to_tstring(ptr, 1, NULL, 0, 0, 0, 0); if (str) { lua_pushstring(L, str); } else { @@ -1783,7 +1782,6 @@ int lmt_get_box_id(lua_State *L, int i, int report) int cmd = eq_type(cs); switch (cmd) { case char_given_cmd: - // case math_char_given_cmd: case integer_cmd: index = eq_value(cs); break; @@ -2597,7 +2595,6 @@ static int texlib_newindex(lua_State *L) static int texlib_aux_convert(lua_State *L, int cur_code) { int i = -1; - char *str = NULL; switch (cur_code) { /* ignored (yet) */ case insert_progress_code: /* arg */ @@ -2632,19 +2629,22 @@ static int texlib_aux_convert(lua_State *L, int cur_code) if (cur_code < 32) { int texstr = tex_the_convert_string(cur_code, i); if (texstr) { - str = tex_makecstring(texstr); + lua_pushstring(L, tex_to_cstring(texstr)); tex_flush_str(texstr); + + // int allocated = 0; + // char *str = tex_makecstring(texstr, &allocated); + // lua_pushstring(L, str); + // if (allocated) { + // lmt_memory_free(str); + // } + // tex_flush_str(texstr); + return 1; } } break; } - /* end */ - if (str) { - lua_pushstring(L, str); - lmt_memory_free(str); - } else { - lua_pushnil(L); - } + lua_pushnil(L); return 1; } @@ -2687,10 +2687,9 @@ static int texlib_aux_scan_internal(lua_State *L, int cmd, int code, int values) default: { int texstr = tex_the_scanned_result(); - char *str = tex_makecstring(texstr); + char *str = tex_to_cstring(texstr); if (str) { lua_pushstring(L, str); - lmt_memory_free(str); } else { lua_pushnil(L); } @@ -3013,7 +3012,6 @@ static int texlib_get_internal(lua_State *L, int index, int all) case set_auxiliary_cmd: case set_page_property_cmd: case char_given_cmd: - // case math_char_given_cmd: case integer_cmd: case dimension_cmd: case gluespec_cmd: @@ -3407,26 +3405,22 @@ static int texlib_hashtokens(lua_State *L) int nx = 0; int all = lua_toboolean(L, 1); lua_createtable(L, hash_size, 0); + /* todo: check active characters as these have three bogus bytes in front */ if (all) { while (cs <= hash_size) { - /* because strings never get freed we can as well directly access |s|. */ strnumber s = cs_text(cs); if (s > 0) { halfword n = cs_next(cs); - char *ss = tex_makecstring(s); if (n) { int mt = 0; lua_createtable(L, 2, 0); - lua_pushstring(L, ss); - lmt_memory_free(ss); + lua_pushstring(L, tex_to_cstring(s)); ++nt; lua_rawseti(L, -2, ++mt); while (n) { s = cs_text(n); if (s) { - ss = tex_makecstring(s); - lua_pushstring(L, ss); - lmt_memory_free(ss); + lua_pushstring(L, tex_to_cstring(s)); lua_rawseti(L, -2, ++mt); ++nt; ++nx; @@ -3434,8 +3428,7 @@ static int texlib_hashtokens(lua_State *L) n = cs_next(n); } } else { - lua_pushstring(L, ss); - lmt_memory_free(ss); + lua_pushstring(L, tex_to_cstring(s)); ++nt; } } else { @@ -3449,16 +3442,12 @@ static int texlib_hashtokens(lua_State *L) strnumber s = cs_text(cs); if (s > 0) { halfword n = cs_next(cs); - char *ss = tex_makecstring(s); - lua_pushstring(L, ss); - lmt_memory_free(ss); + lua_pushstring(L, tex_to_cstring(s)); lua_rawseti(L, -2, ++nt); while (n) { s = cs_text(n); if (s) { - ss = tex_makecstring(s); - lua_pushstring(L, ss); - lmt_memory_free(ss); + lua_pushstring(L, tex_to_cstring(s)); lua_rawseti(L, -2, ++nt); ++nx; } @@ -3482,9 +3471,7 @@ static int texlib_primitives(lua_State *L) while (cs < prim_size) { strnumber s = get_prim_text(cs); if (s > 0 && (get_prim_origin(cs) != no_command)) { - char *ss = tex_makecstring(s); - lua_pushstring(L, ss); - lmt_memory_free(ss); + lua_pushstring(L, tex_to_cstring(s)); lua_rawseti(L, -2, ++nt); } cs++; @@ -3518,9 +3505,7 @@ static int texlib_extraprimitives(lua_State *L) while (cs < prim_size) { strnumber s = get_prim_text(cs); if (s > 0 && (get_prim_origin(cs) & mask)) { - char *ss = tex_makecstring(s); - lua_pushstring(L, ss); - lmt_memory_free(ss); + lua_pushstring(L, tex_to_cstring(s)); lua_rawseti(L, -2, ++nt); } cs++; @@ -3531,7 +3516,7 @@ static int texlib_extraprimitives(lua_State *L) static void texlib_aux_enableprimitive(const char *pre, size_t prel, const char *prm) { strnumber s = tex_maketexstring(prm); - halfword prm_val = tex_prim_lookup(s); + halfword prm_val = tex_prim_lookup(s); /* todo: no need for tex string */ tex_flush_str(s); if (prm_val != undefined_primitive && get_prim_origin(prm_val) != no_command) { char *newprm; @@ -3594,10 +3579,8 @@ static int texlib_enableprimitives(lua_State *L) for (int cs = 0; cs < prim_size; cs++) { strnumber s = get_prim_text(cs); if (s > 0) { - /* there is actually no need to copy */ - char *prm = tex_makecstring(s); + char *prm = tex_to_cstring(s); texlib_aux_enableprimitive(pre, lpre, prm); - lmt_memory_free(prm); } } } @@ -4561,8 +4544,6 @@ static int texlib_mathchardef(lua_State *L) d.index = lmt_optinteger(L, 8, 0); if (class_in_range(m.class_value) && family_in_range(m.family_value) && character_in_range(m.character_value)) { tex_define(flags, cs, mathspec_cmd, tex_new_math_dict_spec(d, m, umath_mathcode)); - // halfword code = math_packed_character(m.class_value, m.family_value, m.character_value); - // tex_define(flags, cs, (quarterword) math_char_xgiven_cmd, code); } else { tex_normal_error("lua", "mathchardef needs proper class, family and character codes"); } diff --git a/source/luametatex/source/lua/lmttokenlib.c b/source/luametatex/source/lua/lmttokenlib.c index ac69241ba..feac7cd46 100644 --- a/source/luametatex/source/lua/lmttokenlib.c +++ b/source/luametatex/source/lua/lmttokenlib.c @@ -156,8 +156,6 @@ void lmt_tokenlib_initialize(void) lmt_interface.command_names[math_shift_cs_cmd] = (command_item) { .id = math_shift_cs_cmd, .lua = lua_key_index(math_shift_cs), .name = lua_key(math_shift_cs), .kind = regular_command_item, .min = 0, .max = last_math_shift_cs_code, .base = 0, .fixedvalue = 0 }; /* a bit too tolerant */ lmt_interface.command_names[end_cs_name_cmd] = (command_item) { .id = end_cs_name_cmd, .lua = lua_key_index(end_cs_name), .name = lua_key(end_cs_name), .kind = regular_command_item, .min = 0, .max = 0, .base = 0, .fixedvalue = 0 }; lmt_interface.command_names[char_given_cmd] = (command_item) { .id = char_given_cmd, .lua = lua_key_index(char_given), .name = lua_key(char_given), .kind = character_command_item, .min = 0, .max = max_character_code, .base = 0, .fixedvalue = 0 }; - // lmt_interface.command_names[math_char_given_cmd] = (command_item) { .id = math_char_given_cmd, .lua = lua_key_index(math_char_given), .name = lua_key(math_char_given), .kind = character_command_item, .min = 0, .max = max_character_code, .base = 0, .fixedvalue = 0 }; - // lmt_interface.command_names[math_char_xgiven_cmd] = (command_item) { .id = math_char_xgiven_cmd, .lua = lua_key_index(math_char_xgiven), .name = lua_key(math_char_xgiven), .kind = character_command_item, .min = 0, .max = max_character_code, .base = 0, .fixedvalue = 0 }; lmt_interface.command_names[some_item_cmd] = (command_item) { .id = some_item_cmd, .lua = lua_key_index(some_item), .name = lua_key(some_item), .kind = regular_command_item, .min = 0, .max = last_some_item_code, .base = 0, .fixedvalue = 0 }; lmt_interface.command_names[internal_toks_cmd] = (command_item) { .id = internal_toks_cmd, .lua = lua_key_index(internal_toks), .name = lua_key(internal_toks), .kind = internal_command_item, .min = first_toks_code, .max = last_toks_code, .base = internal_toks_base, .fixedvalue = 0 }; lmt_interface.command_names[register_toks_cmd] = (command_item) { .id = register_toks_cmd, .lua = lua_key_index(register_toks), .name = lua_key(register_toks), .kind = register_command_item, .min = 0, .max = biggest_reg, .base = register_toks_base, .fixedvalue = 0 }; @@ -433,10 +431,10 @@ void lmt_token_list_to_lua(lua_State *L, halfword p) } } -void lmt_token_list_to_luastring(lua_State *L, halfword p, int nospace, int strip) +void lmt_token_list_to_luastring(lua_State *L, halfword p, int nospace, int strip, int wipe) { int l; - char *s = tex_tokenlist_to_tstring(p, 1, &l, 0, nospace, strip); /* nasty ... preambles or not, could have been endmatchtoken */ + char *s = tex_tokenlist_to_tstring(p, 1, &l, 0, nospace, strip, wipe); /* nasty ... preambles or not, could have been endmatchtoken */ if (l) { lua_pushlstring(L, s, (size_t) l); } else { @@ -511,16 +509,19 @@ halfword lmt_token_code_from_lua(lua_State *L, int slot) # define is_active_string(s) (strlen(s) > 3 && *s == 0xEF && *(s+1) == 0xBF && *(s+2) == 0xBF) -static unsigned char *tokenlib_aux_get_cs_text(int cs) +static unsigned char *tokenlib_aux_get_cs_text(int cs, int *allocated) { if (cs == null_cs) { - return (unsigned char *) lmt_memory_strdup("\\csname\\endcsname"); + return (unsigned char *) "\\csname\\endcsname"; } else if ((cs_text(cs) < 0) || (cs_text(cs) >= lmt_string_pool_state.string_pool_data.ptr)) { - return (unsigned char *) lmt_memory_strdup(""); - } else if (tex_is_active_cs(cs_text(cs))) { - return (unsigned char *) tex_makecstring(cs_text(cs)); + return (unsigned char *) ""; + // } else { + // return (unsigned char *) tex_makecstring(cs_text(cs)); + } else if (cs_text(cs) < cs_offset_value) { + *allocated = 1; + return (unsigned char *) aux_uni2str((unsigned) cs_text(cs)); } else { - return (unsigned char *) tex_makecstring(cs_text(cs)); + return (unsigned char *) (str_length(cs_text(cs)) > 0 ? (unsigned char *) str_string(cs_text(cs)) : (unsigned char *) ""); } } @@ -871,14 +872,17 @@ static int tokenlib_scan_csname(lua_State *L) } t = cur_cs ? cs_token_flag + cur_cs : token_val (cur_cmd, cur_chr); if (t >= cs_token_flag) { - unsigned char *s = tokenlib_aux_get_cs_text(t - cs_token_flag); + int allocated = 0; + unsigned char *s = tokenlib_aux_get_cs_text(t - cs_token_flag, &allocated); if (s) { if (tex_is_active_cs(cs_text(t - cs_token_flag))) { lua_pushstring(L, (char *) (s + 3)); } else { lua_pushstring(L, (char *) s); } - lmt_memory_free(s); + if (allocated) { + lmt_memory_free(s); + } } else { lua_pushnil(L); } @@ -1408,8 +1412,7 @@ static int tokenlib_scan_string(lua_State *L) { halfword defref = lmt_input_state.def_ref; halfword result = tex_scan_toks_expand(1, NULL, 0); - lmt_token_list_to_luastring(L, result, 0, 0); - tex_flush_token_list(result); + lmt_token_list_to_luastring(L, result, 0, 0, 1); lmt_input_state.def_ref = defref; break; } @@ -1421,8 +1424,7 @@ static int tokenlib_scan_string(lua_State *L) case tolerant_semi_protected_call_cmd: { halfword t = token_link(cur_chr); - lmt_token_list_to_luastring(L, t, 0, 0); - tex_flush_token_list(t); + lmt_token_list_to_luastring(L, t, 0, 0, 1); break; } case letter_cmd: @@ -1463,8 +1465,7 @@ static int tokenlib_scan_argument(lua_State *L) halfword defref = lmt_input_state.def_ref; int expand = lua_type(L, 1) == LUA_TBOOLEAN ? lua_toboolean(L, 1) : 1; halfword result = expand ? tex_scan_toks_expand(1, NULL, 0) : tex_scan_toks_normal(1, NULL); - lmt_token_list_to_luastring(L, result, 0, 0); - tex_flush_token_list(result); + lmt_token_list_to_luastring(L, result, 0, 0, 1); lmt_input_state.def_ref = defref; break; } @@ -1485,8 +1486,7 @@ static int tokenlib_scan_argument(lua_State *L) tex_back_input(cur_tok); result = tex_scan_toks_expand(1, NULL, 0); } - lmt_token_list_to_luastring(L, result, 0, 0); - tex_flush_token_list(result); + lmt_token_list_to_luastring(L, result, 0, 0, 1); lmt_input_state.def_ref = defref; break; } @@ -1685,8 +1685,7 @@ static int tokenlib_scan_delimited(lua_State *L) FINALYDONE: /* */ lmt_input_state.def_ref = defref; - lmt_token_list_to_luastring(L, result, 0, 0); - tex_flush_token_list(result); + lmt_token_list_to_luastring(L, result, 0, 0, 1); } else { tex_back_input(cur_tok); lua_pushnil(L); @@ -1781,8 +1780,7 @@ static int tokenlib_grab_until(lua_State *L) } tokenlib_aux_unsave_tex_scanner(texstate); lmt_input_state.def_ref = defref; - lmt_token_list_to_luastring(L, result, nospace, strip); - tex_flush_token_list(result); + lmt_token_list_to_luastring(L, result, nospace, strip, 1); } else { lua_pushnil(L); } @@ -2013,8 +2011,7 @@ static int tokenlib_scan_value(lua_State *L) halfword defref = lmt_input_state.def_ref; result = tex_scan_toks_expand(1, NULL, 0); lmt_input_state.def_ref = defref; - lmt_token_list_to_luastring(L, result, 0, 0); - tex_flush_token_list(result); + lmt_token_list_to_luastring(L, result, 0, 0, 1); } break; /* @@ -2052,8 +2049,7 @@ static int tokenlib_scan_value(lua_State *L) halfword defref = lmt_input_state.def_ref; result = tex_scan_toks_expand(1, NULL, 0); lmt_input_state.def_ref = defref; - lmt_token_list_to_luastring(L, result, 0, 0); - tex_flush_token_list(result); + lmt_token_list_to_luastring(L, result, 0, 0, 1); luaL_addchar(&b, '{'); luaL_addvalue(&b); luaL_addchar(&b, '}'); @@ -2069,7 +2065,8 @@ static int tokenlib_scan_value(lua_State *L) /*tex We need to add a space. */ halfword t = cur_cs ? cs_token_flag + cur_cs : token_val(cur_cmd, cur_chr); if (t >= cs_token_flag) { - unsigned char *s = tokenlib_aux_get_cs_text(t - cs_token_flag); + int allocated = 0; + unsigned char *s = tokenlib_aux_get_cs_text(t - cs_token_flag, &allocated); if (s) { if (tex_is_active_cs(cs_text(t - cs_token_flag))) { lua_pushstring(L, (char *) (s + 3)); @@ -2080,7 +2077,9 @@ static int tokenlib_scan_value(lua_State *L) luaL_addvalue(&b); luaL_addchar(&b, ' '); } - lmt_memory_free(s); + if (allocated) { + lmt_memory_free(s); + } } } } @@ -2377,7 +2376,7 @@ static int tokenlib_getprimitives(lua_State *L) while (cs < prim_size) { strnumber s = get_prim_text(cs); if (s > 0 && (get_prim_origin(cs) != no_command)) { - char *ss = tex_makecstring(s); + char *ss = tex_to_cstring(s); int cmd = prim_eq_type(cs); int chr = prim_equiv(cs); if (! raw) { @@ -2393,7 +2392,6 @@ static int tokenlib_getprimitives(lua_State *L) lua_pushinteger(L, prim_origin(cs)); lua_rawseti(L, -2, 4); lua_rawseti(L, -2, ++nt); - lmt_memory_free(ss); } cs++; } @@ -2508,14 +2506,17 @@ inline static int tokenlib_get_csname(lua_State *L) lua_token *n = tokenlib_aux_check_istoken(L, 1); halfword tok = token_info(n->token); if (tok >= cs_token_flag) { - unsigned char *s = tokenlib_aux_get_cs_text(tok - cs_token_flag); + int allocated = 0; + unsigned char *s = tokenlib_aux_get_cs_text(tok - cs_token_flag, &allocated); if (s) { if (tex_is_active_cs(cs_text(tok - cs_token_flag))) { lua_pushstring(L, (char *) (s + 3)); } else { lua_pushstring(L, (char *) s); } - lmt_memory_free(s); + if (allocated) { + lmt_memory_free(s); + } return 1; } } @@ -2544,10 +2545,13 @@ inline static int tokenlib_get_active(lua_State *L) halfword tok = token_info(n->token); int result = 0; if (tok >= cs_token_flag) { - unsigned char *s = tokenlib_aux_get_cs_text(tok - cs_token_flag); + int allocated = 0; + unsigned char *s = tokenlib_aux_get_cs_text(tok - cs_token_flag, &allocated); if (s) { result = tex_is_active_cs(cs_text(tok - cs_token_flag)); - lmt_memory_free(s); + if (allocated) { + lmt_memory_free(s); + } } } lua_pushboolean(L, result); @@ -2753,7 +2757,8 @@ static int tokenlib_get_fields(lua_State *L) lua_createtable(L, 0, onlyflags ? 0 : 5); if (tok >= cs_token_flag) { int t = tok - cs_token_flag; - unsigned char* str = tokenlib_aux_get_cs_text(t); + int allocated = 0; + unsigned char* str = tokenlib_aux_get_cs_text(t, &allocated); if (str) { if (! onlyflags) { lua_push_key(csname); @@ -2767,7 +2772,9 @@ static int tokenlib_get_fields(lua_State *L) } lua_rawset(L, -3); } - lmt_memory_free(str); + if (allocated) { + lmt_memory_free(str); + } } cmd = eq_type(t); chr = eq_value(t); @@ -2836,9 +2843,12 @@ static int tokenlib_tostring(lua_State* L) unsigned char* csp = NULL; const char* cmn = NULL; if (tok >= cs_token_flag) { + int allocated = 0; tok -= cs_token_flag; - csn = tokenlib_aux_get_cs_text(tok); - csp = csn; + csn = tokenlib_aux_get_cs_text(tok, &allocated); + if (allocated) { + csp = csn; + } if (csn && tex_is_active_cs(cs_text(tok))) { csn += 3; } @@ -2974,7 +2984,7 @@ static int tokenlib_get_meaning(lua_State *L) lmt_token_register_to_lua(L, chr); } } else { - char *str = tex_tokenlist_to_tstring(chr, 1, NULL, 0, 0, 0); + char *str = tex_tokenlist_to_tstring(chr, 1, NULL, 0, 0, 0, 0); lua_pushstring(L, str ? str : ""); } return 1; @@ -3041,10 +3051,9 @@ static int tokenlib_get_macro(lua_State *L) char *str = NULL; if (lua_toboolean(L, 2)) { tokenlib_aux_expand_macros_in_tokenlist(chr); // todo: use return value instead of def_ref - str = tex_tokenlist_to_tstring(lmt_input_state.def_ref, 1, NULL, 0, 0, 0); - tex_flush_token_list(lmt_input_state.def_ref); + str = tex_tokenlist_to_tstring(lmt_input_state.def_ref, 1, NULL, 0, 0, 0, 1); } else { - str = tex_tokenlist_to_tstring(chr, 1, NULL, 1, 0, 0); + str = tex_tokenlist_to_tstring(chr, 1, NULL, 1, 0, 0, 0); } lua_pushstring(L, str ? str : ""); return 1; @@ -3091,8 +3100,7 @@ char *lmt_get_expansion(halfword head, int *len) halfword ref = get_reference_token(); set_token_link(ref, head); tokenlib_aux_expand_macros_in_tokenlist(ref); // todo: use return value instead of def_ref - str = tex_tokenlist_to_tstring(lmt_input_state.def_ref, 1, len, 0, 0, 0); - tex_flush_token_list(lmt_input_state.def_ref); + str = tex_tokenlist_to_tstring(lmt_input_state.def_ref, 1, len, 0, 0, 0, 1); tex_flush_token_list(ref); return str; } @@ -3113,12 +3121,9 @@ static int tokenlib_get_expansion(lua_State* L) char *s; int l; tex_parse_str_to_tok(h, &t, ct, str, len, 2); /* ignore unknown */ - tokenlib_aux_expand_macros_in_tokenlist(h); // todo: use return value instead of def_ref - s = tex_tokenlist_to_tstring(lmt_input_state.def_ref, 1, &l, 0, 0, 0); - tex_flush_token_list(lmt_input_state.def_ref); + s = tex_tokenlist_to_tstring(lmt_input_state.def_ref, 1, &l, 0, 0, 0, 1); tex_flush_token_list(h); - if (l > 0) { lua_pushlstring(L, (const char *) s, (size_t) l); return 1; @@ -3472,9 +3477,8 @@ static int tokenlib_serialize(lua_State *L) halfword t = n->token; char *s; tokenlib_aux_expand_macros_in_tokenlist(t); // todo: use return value instead of def_ref - s = tex_tokenlist_to_tstring(lmt_input_state.def_ref, 1, NULL, 0, 0, 0); + s = tex_tokenlist_to_tstring(lmt_input_state.def_ref, 1, NULL, 0, 0, 0, 1); lua_pushstring(L, s ? s : ""); - tex_flush_token_list(lmt_input_state.def_ref); } else { lua_pushnil(L); } @@ -3656,7 +3660,7 @@ void lmt_token_call(int p) /*tex The \TEX\ pointer to the token list. */ { LoadS ls; int l = 0; - ls.s = tex_tokenlist_to_tstring(p, 1, &l, 0, 0, 0); + ls.s = tex_tokenlist_to_tstring(p, 1, &l, 0, 0, 0, 0); ls.size = (size_t) l; if (ls.size > 0) { lua_State *L = lmt_lua_state.lua_instance; diff --git a/source/luametatex/source/lua/lmttokenlib.h b/source/luametatex/source/lua/lmttokenlib.h index 5339a80fe..450c6173a 100644 --- a/source/luametatex/source/lua/lmttokenlib.h +++ b/source/luametatex/source/lua/lmttokenlib.h @@ -28,7 +28,7 @@ typedef enum command_item_types { } command_item_types; extern void lmt_token_list_to_lua (lua_State *L, halfword p); -extern void lmt_token_list_to_luastring (lua_State *L, halfword p, int nospace, int strip); +extern void lmt_token_list_to_luastring (lua_State *L, halfword p, int nospace, int strip, int wipe); extern halfword lmt_token_list_from_lua (lua_State *L, int slot); extern halfword lmt_token_code_from_lua (lua_State *L, int slot); diff --git a/source/luametatex/source/luacore/lua54/src/ltable.c b/source/luametatex/source/luacore/lua54/src/ltable.c index 1b1cd2415..d03e74865 100644 --- a/source/luametatex/source/luacore/lua54/src/ltable.c +++ b/source/luametatex/source/luacore/lua54/src/ltable.c @@ -107,7 +107,7 @@ static const TValue absentkey = {ABSTKEYCONSTANT}; */ static Node *hashint (const Table *t, lua_Integer i) { lua_Unsigned ui = l_castS2U(i); - if (ui <= (unsigned int)INT_MAX) + if (ui <= cast_uint(INT_MAX)) return hashmod(t, cast_int(ui)); else return hashmod(t, ui); @@ -488,7 +488,7 @@ static void setnodevector (lua_State *L, Table *t, unsigned int size) { luaG_runerror(L, "table overflow"); size = twoto(lsize); t->node = luaM_newvector(L, size, Node); - for (i = 0; i < (int)size; i++) { + for (i = 0; i < cast_int(size); i++) { Node *n = gnode(t, i); gnext(n) = 0; setnilkey(n); diff --git a/source/luametatex/source/luametatex.h b/source/luametatex/source/luametatex.h index 32fd78f6d..736d21173 100644 --- a/source/luametatex/source/luametatex.h +++ b/source/luametatex/source/luametatex.h @@ -87,9 +87,9 @@ # include "tex/textypes.h" # define luametatex_version 210 -# define luametatex_revision 01 -# define luametatex_version_string "2.10.01" -# define luametatex_development_id 20221014 +# define luametatex_revision 02 +# define luametatex_version_string "2.10.02" +# define luametatex_development_id 20221019 # define luametatex_name_camelcase "LuaMetaTeX" # define luametatex_name_lowercase "luametatex" diff --git a/source/luametatex/source/tex/texequivalents.c b/source/luametatex/source/tex/texequivalents.c index 291126fff..aa434d8fd 100644 --- a/source/luametatex/source/tex/texequivalents.c +++ b/source/luametatex/source/tex/texequivalents.c @@ -1437,7 +1437,7 @@ void tex_forced_word_define(int g, halfword p, singleword f, halfword w) void tex_save_for_after_group(halfword t) { - if (cur_level > level_one && tex_room_on_save_stack()) { + if (t && cur_level > level_one && tex_room_on_save_stack()) { save_type(lmt_save_state.save_stack_data.ptr) = insert_tokens_save_type; save_level(lmt_save_state.save_stack_data.ptr) = level_zero; save_value(lmt_save_state.save_stack_data.ptr) = t; diff --git a/source/luametatex/source/tex/texexpand.c b/source/luametatex/source/tex/texexpand.c index 25dcccdf3..a0416d118 100644 --- a/source/luametatex/source/tex/texexpand.c +++ b/source/luametatex/source/tex/texexpand.c @@ -684,7 +684,7 @@ inline static halfword tex_aux_get_cs_name(void) if (tex_aux_collect_cs_tokens(&p, &n)) { /*tex Look up the characters of list |r| in the hash table, and set |cur_cs|. */ int siz; - char *s = tex_tokenlist_to_tstring(h, 1, &siz, 0, 0, 0); + char *s = tex_tokenlist_to_tstring(h, 1, &siz, 0, 0, 0, 0); cur_cs = (siz > 0) ? tex_string_locate((char *) s, siz, 1) : null_cs; } else { tex_aux_complain_missing_csname(); diff --git a/source/luametatex/source/tex/texfileio.c b/source/luametatex/source/tex/texfileio.c index 4f712401b..c29e7cece 100644 --- a/source/luametatex/source/tex/texfileio.c +++ b/source/luametatex/source/tex/texfileio.c @@ -875,10 +875,8 @@ char *tex_read_file_name(int optionalequal, const char * name, const char* ext) } } DONE: - s = tex_tokenlist_to_tstring(result, 1, &l, 0, 0, 0); + s = tex_tokenlist_to_tstring(result, 1, &l, 0, 0, 0, 1); fn = s ? tex_aux_pack_file_name(s, l, name, ext) : NULL; - /*tex Shouldn't we also free |result| ? */ - tex_flush_token_list(result); return fn; } diff --git a/source/luametatex/source/tex/texlanguage.c b/source/luametatex/source/tex/texlanguage.c index 6f3460c22..22627ee58 100644 --- a/source/luametatex/source/tex/texlanguage.c +++ b/source/luametatex/source/tex/texlanguage.c @@ -364,7 +364,7 @@ void tex_clear_patterns(struct tex_language *lang) void tex_load_tex_patterns(halfword curlang, halfword head) { - char *s = tex_tokenlist_to_tstring(head, 1, NULL, 0, 0, 0); + char *s = tex_tokenlist_to_tstring(head, 1, NULL, 0, 0, 0, 0); if (s) { tex_load_patterns(tex_get_language(curlang), (unsigned char *) s); } @@ -539,7 +539,7 @@ void tex_clear_hyphenation(struct tex_language *lang) void tex_load_tex_hyphenation(halfword curlang, halfword head) { - char *s = tex_tokenlist_to_tstring(head, 1, NULL, 0, 0, 0); + char *s = tex_tokenlist_to_tstring(head, 1, NULL, 0, 0, 0, 0); if (s) { tex_load_hyphenation(tex_get_language(curlang), (unsigned char *) s); } diff --git a/source/luametatex/source/tex/texlinebreak.c b/source/luametatex/source/tex/texlinebreak.c index 2172277ec..2e0c945a7 100644 --- a/source/luametatex/source/tex/texlinebreak.c +++ b/source/luametatex/source/tex/texlinebreak.c @@ -3145,7 +3145,7 @@ static void tex_aux_post_line_break(const line_break_properties *properties, hal n = node_next(n); } } - if (! n) { + if (! n && normalize_line_mode_par) { /*tex For the moment: */ tex_normal_warning("tex", "right parinit skip is gone"); } @@ -3163,7 +3163,7 @@ static void tex_aux_post_line_break(const line_break_properties *properties, hal n = node_prev(n); } } - if (! n) { + if (! n && normalize_line_mode_par) { /*tex For the moment: */ tex_normal_warning("tex", "left parfill skip is gone"); } diff --git a/source/luametatex/source/tex/texmaincontrol.c b/source/luametatex/source/tex/texmaincontrol.c index a44aa1167..5e0bb2f92 100644 --- a/source/luametatex/source/tex/texmaincontrol.c +++ b/source/luametatex/source/tex/texmaincontrol.c @@ -1372,11 +1372,13 @@ static void tex_aux_run_after_something(void) { } while (cur_cmd == spacer_cmd); if (cur_cmd == left_brace_cmd) { halfword source = tex_scan_toks_normal(1, NULL); - if (source) { - tex_save_for_after_group(token_link(source)); - token_link(source) = null; + if (source) { + if (token_link(source)) { + tex_save_for_after_group(token_link(source)); + token_link(source) = null; + } + tex_put_available_token(source); } - tex_flush_token_list(source); } else { tex_handle_error( normal_error_type, @@ -1394,10 +1396,11 @@ static void tex_aux_run_after_something(void) { if (cur_cmd == left_brace_cmd) { halfword source = tex_scan_toks_normal(1, NULL); if (source) { + /*tex Always, also when empty. */ lmt_main_control_state.after_tokens = token_link(source); token_link(source) = null; + tex_put_available_token(source); } - tex_flush_token_list(source); } else { tex_handle_error( normal_error_type, @@ -1422,7 +1425,7 @@ static void tex_aux_run_after_something(void) { } token_link(p) = token_link(source); token_link(source) = null; - tex_flush_token_list(source); + tex_put_available_token(source); } else { update_tex_end_of_group(source); } @@ -4118,7 +4121,6 @@ static void tex_aux_set_shorthand_def(int a, int force) { mathcodeval mval = tex_scan_mathchar(tex_mathcode); tex_define(a, p, mathspec_cmd, tex_new_math_spec(mval, tex_mathcode)); - // tex_define(a, p, math_char_given_cmd, math_old_packed_character(mval.class_value,mval.family_value,mval.character_value)); break; } case math_dchar_def_code: @@ -4126,14 +4128,12 @@ static void tex_aux_set_shorthand_def(int a, int force) mathdictval dval = tex_scan_mathdict(); mathcodeval mval = tex_scan_mathchar(umath_mathcode); tex_define(a, p, mathspec_cmd, tex_new_math_dict_spec(dval, mval, umath_mathcode)); - // tex_define(a, p, math_char_xgiven_cmd, math_packed_character(mval.class_value,mval.family_value,mval.character_value)); break; } case math_xchar_def_code: { mathcodeval mval = tex_scan_mathchar(umath_mathcode); tex_define(a, p, mathspec_cmd, tex_new_math_spec(mval, umath_mathcode)); - // tex_define(a, p, math_char_xgiven_cmd, math_packed_character(mval.class_value,mval.family_value,mval.character_value)); break; } case count_def_code: @@ -5854,14 +5854,13 @@ static void tex_aux_run_message(void) strnumber s = tex_aux_scan_string(); if (error_help_par) { strnumber helpinfo = tex_tokens_to_string(error_help_par); - char *h = tex_makecstring(helpinfo); + char *h = tex_to_cstring(helpinfo); tex_handle_error( normal_error_type, "%T", s, h ); - lmt_memory_free(h); tex_flush_str(helpinfo); } else if (lmt_error_state.long_help_seen) { tex_handle_error( @@ -6298,8 +6297,6 @@ inline static void tex_aux_big_switch(int mode, int cmd) register_runner(italic_correction_cmd, tex_aux_run_illegal_case, tex_aux_run_text_italic_correction, tex_run_math_italic_correction); register_runner(math_char_number_cmd, tex_aux_run_math_non_math, tex_run_text_math_char_number, tex_run_math_math_char_number); - // register_runner(math_char_given_cmd, tex_aux_run_math_non_math, tex_run_text_math_char_given, tex_run_math_math_char_given); - // register_runner(math_char_xgiven_cmd, tex_aux_run_math_non_math, tex_run_text_math_char_xgiven, tex_run_math_math_char_xgiven); register_runner(mathspec_cmd, tex_aux_run_math_non_math, tex_run_text_math_spec, tex_run_math_math_spec); register_runner(vadjust_cmd, tex_aux_run_illegal_case, tex_run_vadjust, tex_run_vadjust); diff --git a/source/luametatex/source/tex/texmath.c b/source/luametatex/source/tex/texmath.c index 52e200657..3f452b1ff 100644 --- a/source/luametatex/source/tex/texmath.c +++ b/source/luametatex/source/tex/texmath.c @@ -1713,12 +1713,6 @@ static int tex_aux_scan_math(halfword target, halfword style, int usetextfont, h mval = tex_get_math_spec(cur_chr); dval = tex_get_math_dict(cur_chr); break; - // case math_char_given_cmd: - // mval = tex_mathchar_from_integer(cur_chr, tex_mathcode); - // break; - // case math_char_xgiven_cmd: - // mval = tex_mathchar_from_integer(cur_chr, umath_mathcode); - // break; case delimiter_number_cmd: switch (cur_chr) { case math_delimiter_code: @@ -1962,12 +1956,6 @@ int tex_scan_math_cmd_val(mathcodeval *mval, mathdictval *dval) tex_get_x_token(); } while (cur_cmd == spacer_cmd); switch (cur_cmd) { - // case math_char_given_cmd: - // *mval = tex_mathchar_from_integer(cur_chr, tex_mathcode); - // break; - // case math_char_xgiven_cmd: - // *mval = tex_mathchar_from_integer(cur_chr, umath_mathcode); - // break; case mathspec_cmd: *mval = tex_get_math_spec(cur_chr); break; @@ -2050,26 +2038,6 @@ void tex_run_math_math_char_number(void) { } } -/*tex We build up an argument to |append_math_char|: */ - -// void tex_run_text_math_char_given(void) { -// tex_aux_append_math_char_in_text(tex_mathchar_from_integer(cur_chr, tex_mathcode)); -// } -// -// void tex_run_math_math_char_given(void) { -// tex_aux_append_math_char(tex_mathchar_from_integer(cur_chr, tex_mathcode)); -// } - -/*tex We build up an argument to |append_math_char| the \LUATEX\ way: */ - -// void tex_run_text_math_char_xgiven(void) { -// tex_aux_append_math_char_in_text(tex_mathchar_from_integer(cur_chr, umath_mathcode)); -// } -// -// void tex_run_math_math_char_xgiven(void) { -// tex_aux_append_math_char(tex_mathchar_from_integer(cur_chr, umath_mathcode)); -// } - void tex_run_math_delimiter_number(void) { switch (cur_chr) { case math_delimiter_code: diff --git a/source/luametatex/source/tex/texmath.h b/source/luametatex/source/tex/texmath.h index e024a6ba2..cc7aa7e7f 100644 --- a/source/luametatex/source/tex/texmath.h +++ b/source/luametatex/source/tex/texmath.h @@ -642,10 +642,6 @@ extern void tex_run_math_math_char_number (void); extern void tex_run_text_math_char_number (void); extern void tex_run_math_char_number (void); extern void tex_run_math_delimiter_number (void); -// void tex_run_math_math_char_given (void); -// void tex_run_text_math_char_given (void); -// void tex_run_math_math_char_xgiven (void); -// void tex_run_text_math_char_xgiven (void); extern void tex_run_math_equation_number (void); extern void tex_run_math_shift (void); extern void tex_run_math_italic_correction (void); diff --git a/source/luametatex/source/tex/texprimitive.c b/source/luametatex/source/tex/texprimitive.c index bbeea1bc0..42344af15 100644 --- a/source/luametatex/source/tex/texprimitive.c +++ b/source/luametatex/source/tex/texprimitive.c @@ -185,7 +185,7 @@ static int tex_aux_room_in_hash(void) inline static halfword tex_aux_compute_hash(const char *j, int l) { halfword h = (unsigned const char) j[0]; - for (int k = 1; k < l; k++) { + for (unsigned k = 1; k < l; k++) { h = (h + h + (unsigned const char) j[k]) % hash_prime; } return h; @@ -765,18 +765,6 @@ void tex_print_cmd_chr(singleword cmd, halfword chr) tex_print_str_esc("char"); tex_print_qhex(chr); break; - // case math_char_given_cmd: - // /*tex - // Okay, it's better for old macro packages that mess with meaning to report a more - // traditional value. A compromise. But, this might be dropped. - // */ - // tex_print_str_esc("mathchar"); - // tex_show_mathcode_value(tex_mathchar_from_integer(chr, tex_mathcode), tex_mathcode); - // break; - // case math_char_xgiven_cmd: - // tex_print_str_esc("Umathchar"); - // tex_show_mathcode_value(tex_mathchar_from_integer(chr, umath_mathcode), umath_mathcode); - // break; case lua_call_cmd: tex_aux_show_lua_call("luacall", chr); break; diff --git a/source/luametatex/source/tex/texprinting.c b/source/luametatex/source/tex/texprinting.c index 9a7c1d729..deabb4b72 100644 --- a/source/luametatex/source/tex/texprinting.c +++ b/source/luametatex/source/tex/texprinting.c @@ -217,9 +217,9 @@ void tex_print_char(int s) The first 256 entries above the 17th unicode plane are used for a special trick: when \TEX\ has to print items in that range, it will instead print the character that results from substracting - 0x110000 from that value. This allows byte-oriented output to things like |\specials|. - - This feature will disappear. + 0x110000 from that value. This allows byte-oriented output to things like |\specials|. We dropped + this feature because it was never used (we used it as part of experiments with \LUATEX). The old + code branches can be found in the repository. */ @@ -245,13 +245,6 @@ static void tex_aux_uprint(int s) tex_print_char(0xE0 + (s / 0x1000)); tex_print_char(0x80 + ((s % 0x1000) / 0x40)); tex_print_char(0x80 + ((s % 0x1000) % 0x40)); - } else if (s >= 0x110000) { - int c = s - 0x110000; - if (c >= 256) { - tex_formatted_warning("print", "bad raw byte to print (c=%d), skipped",c); - } else { - tex_print_char(c); - } } else { tex_print_char(0xF0 + (s / 0x40000)); tex_print_char(0x80 + ((s % 0x40000) / 0x1000)); @@ -260,24 +253,6 @@ static void tex_aux_uprint(int s) } } -static void tex_aux_lprint(lstring *ss) { - /*tex current character code position */ - unsigned char *j = ss->s; - unsigned char *l = j + ss->l; - while (j < l) { - /*tex We don't bother checking the last two bytes explicitly */ - /* 0x110000 in utf=8: 0xF4 0x90 0x80 0x80 */ - if ((j < l - 4) && (*j == 0xF4) && (*(j + 1) == 0x90)) { - int c = (*(j + 2) - 128) * 64 + (*(j + 3) - 128); - tex_print_char(c); - j = j + 4; - } else { - tex_print_char(*j); - ++j; - } - } -} - void tex_print_tex_str(int s) { if (s >= lmt_string_pool_state.string_pool_data.ptr) { @@ -291,7 +266,10 @@ void tex_print_tex_str(int s) } else if (lmt_print_state.selector == new_string_selector_code) { tex_append_string(str_string(s), (unsigned) str_length(s)); } else { - tex_aux_lprint(&str_lstring(s)); + unsigned char *j = str_string(s); + for (unsigned i = 0; i < str_length(s); i++) { + tex_print_char(j[i]); + } } } @@ -453,7 +431,7 @@ void tex_print_tex_str_esc(strnumber s) { /*tex Set variable |c| to the current escape character: */ int c = escape_char_par; - if (c >= 0 && c < 0x110000) { + if (c >= 0) { tex_print_tex_str(c); } if (s) { @@ -467,7 +445,7 @@ void tex_print_str_esc(const char *s) { /*tex Set variable |c| to the current escape character: */ int c = escape_char_par; - if (c >= 0 && c < 0x110000) { + if (c >= 0) { tex_print_tex_str(c); } if (s) { diff --git a/source/luametatex/source/tex/texscanning.c b/source/luametatex/source/tex/texscanning.c index 5dd34b3b6..fec04356b 100644 --- a/source/luametatex/source/tex/texscanning.c +++ b/source/luametatex/source/tex/texscanning.c @@ -1088,18 +1088,13 @@ void tex_scan_something_simple(halfword cmd, halfword chr) switch (cmd) { /* begin of tex_aux_short_scan_something_internal */ case char_given_cmd: - // case math_char_given_cmd: - // case math_char_xgiven_cmd: cur_val = chr; cur_val_level = int_val_level; break; - -case mathspec_cmd: - cur_val = (chr && node_subtype(chr) == tex_mathcode) ? math_spec_value(chr) : 0; - cur_val_level = int_val_level; - break; - - + case mathspec_cmd: + cur_val = (chr && node_subtype(chr) == tex_mathcode) ? math_spec_value(chr) : 0; + cur_val_level = int_val_level; + break; case iterator_value_cmd: cur_val = chr > 0x100000 ? - (chr - 0x100000) : chr; cur_val_level = int_val_level; @@ -1254,8 +1249,6 @@ static halfword tex_aux_scan_something_internal(halfword cmd, halfword chr, int switch (cmd) { /* begin of tex_aux_short_scan_something_internal */ case char_given_cmd: - // case math_char_given_cmd: - // case math_char_xgiven_cmd: cur_val = chr; cur_val_level = int_val_level; break; diff --git a/source/luametatex/source/tex/texstringpool.c b/source/luametatex/source/tex/texstringpool.c index 8367447da..fd93758b5 100644 --- a/source/luametatex/source/tex/texstringpool.c +++ b/source/luametatex/source/tex/texstringpool.c @@ -435,6 +435,7 @@ char *tex_makeclstring(int s, size_t *len) } } +/* char *tex_makecstring(int s) { if (s < cs_offset_value) { @@ -443,6 +444,23 @@ char *tex_makecstring(int s) return lmt_memory_strdup((str_length(s) > 0) ? (const char *) str_string(s) : ""); } } +*/ + +/*tex + I might eventually replace this because in qite some calls we know that we knwo that we have + a pointer in string space. We can kin dof predict in what cases we are below |cs_offset_value| + anyway. +*/ + +char *tex_makecstring(int s, int *allocated) +{ + *allocated = s < cs_offset_value; + if (*allocated) { + return (char *) aux_uni2str((unsigned) s); + } else { + return str_length(s) > 0 ? (char *) str_string(s) : ""; + } +} /*tex diff --git a/source/luametatex/source/tex/texstringpool.h b/source/luametatex/source/tex/texstringpool.h index b3924a0fe..7302e7fb4 100644 --- a/source/luametatex/source/tex/texstringpool.h +++ b/source/luametatex/source/tex/texstringpool.h @@ -21,7 +21,7 @@ typedef struct lstring { unsigned char *s; const char *c; }; - size_t l; /* could be int, but this way we padd */ + size_t l; /* could be int, but this way we padd */ } lstring; typedef struct string_pool_info { @@ -76,35 +76,37 @@ extern string_pool_info lmt_string_pool_state; /*tex Forget the last character in the pool. */ -inline void tex_flush_char(void) { --lmt_string_pool_state.string_temp_top; } - -extern strnumber tex_make_string (void); -extern strnumber tex_push_string (const unsigned char *s, int l); -extern char *tex_take_string (int *len); -extern int tex_str_eq_buf (strnumber s, int k, int n); -extern int tex_str_eq_str (strnumber s, strnumber t); -extern int tex_str_eq_cstr (strnumber s, const char *, size_t); -extern int tex_get_strings_started (void); -extern void tex_reset_cur_string (void); -/* strnumber tex_search_string (strnumber search); */ -/* int tex_used_strings (void); */ -extern strnumber tex_maketexstring (const char *s); -extern strnumber tex_maketexlstring (const char *s, size_t); -extern void tex_append_char (unsigned char c); -extern void tex_append_string (const unsigned char *s, unsigned l); -extern char *tex_makecstring (int s); -extern char *tex_makeclstring (int s, size_t *len); -extern void tex_dump_string_pool (dumpstream f); -extern void tex_undump_string_pool (dumpstream f); -extern void tex_initialize_string_pool (void); -extern void tex_initialize_string_mem (void); -extern void tex_flush_str (strnumber s); -extern strnumber tex_save_cur_string (void); -extern void tex_restore_cur_string (strnumber u); - -/* void tex_increment_pool_string (int n); */ -/* void tex_decrement_pool_string (int n); */ - -extern void tex_compact_string_pool (void); +inline void tex_flush_char(void) { --lmt_string_pool_state.string_temp_top; } + +extern strnumber tex_make_string (void); +extern strnumber tex_push_string (const unsigned char *s, int l); +extern char *tex_take_string (int *len); +extern int tex_str_eq_buf (strnumber s, int k, int n); +extern int tex_str_eq_str (strnumber s, strnumber t); +extern int tex_str_eq_cstr (strnumber s, const char *, size_t); +extern int tex_get_strings_started (void); +extern void tex_reset_cur_string (void); +/* strnumber tex_search_string (strnumber search); */ +/* int tex_used_strings (void); */ +extern strnumber tex_maketexstring (const char *s); +extern strnumber tex_maketexlstring (const char *s, size_t); +extern void tex_append_char (unsigned char c); +extern void tex_append_string (const unsigned char *s, unsigned l); +extern char *tex_makecstring (int s, int *allocated); +extern char *tex_makeclstring (int s, size_t *len); +extern void tex_dump_string_pool (dumpstream f); +extern void tex_undump_string_pool (dumpstream f); +extern void tex_initialize_string_pool (void); +extern void tex_initialize_string_mem (void); +extern void tex_flush_str (strnumber s); +extern strnumber tex_save_cur_string (void); +extern void tex_restore_cur_string (strnumber u); + +/* void tex_increment_pool_string (int n); */ +/* void tex_decrement_pool_string (int n); */ + +extern void tex_compact_string_pool (void); + +inline char *tex_to_cstring (int s) { return str_length(s) > 0 ? (char *) str_string(s) : ""; } # endif diff --git a/source/luametatex/source/tex/textoken.c b/source/luametatex/source/tex/textoken.c index 0bb0f3e45..93bf3913a 100644 --- a/source/luametatex/source/tex/textoken.c +++ b/source/luametatex/source/tex/textoken.c @@ -2820,7 +2820,7 @@ void tex_run_convert_tokens(halfword code) /* halfword result = tex_scan_toks_expand(0, NULL, code == lua_token_string_code); */ lmt_token_state.in_lua_escape = 1; escape_char_par = '\\'; - str.s = (unsigned char *) tex_tokenlist_to_tstring(result, 0, &length, 0, 0, 0); + str.s = (unsigned char *) tex_tokenlist_to_tstring(result, 0, &length, 0, 0, 0, 0); str.l = (unsigned) length; lmt_token_state.in_lua_escape = saved_in_lua_escape; escape_char_par = saved_escape_char; @@ -3034,8 +3034,6 @@ static void tex_aux_append_uchar_to_buffer(int s) lmt_token_state.buffer[lmt_token_state.bufloc++] = (char) (0xE0 + (s / 0x1000)); lmt_token_state.buffer[lmt_token_state.bufloc++] = (char) (0x80 + ((s % 0x1000) / 0x40)); lmt_token_state.buffer[lmt_token_state.bufloc++] = (char) (0x80 + ((s % 0x1000) % 0x40)); - } else if (s >= 0x110000) { - lmt_token_state.buffer[lmt_token_state.bufloc++] = (char) (s - 0x11000); } else { lmt_token_state.buffer[lmt_token_state.bufloc++] = (char) (0xF0 + (s / 0x40000)); lmt_token_state.buffer[lmt_token_state.bufloc++] = (char) (0x80 + ((s % 0x40000) / 0x1000)); @@ -3078,7 +3076,7 @@ static void tex_aux_append_esc_to_buffer(const char *s) /* make two versions: macro and not */ -char *tex_tokenlist_to_tstring(int pp, int inhibit_par, int *siz, int skippreamble, int nospace, int strip) +char *tex_tokenlist_to_tstring(int pp, int inhibit_par, int *siz, int skippreamble, int nospace, int strip, int wipe) { if (pp) { /*tex We need to go beyond the reference. */ @@ -3100,6 +3098,8 @@ char *tex_tokenlist_to_tstring(int pp, int inhibit_par, int *siz, int skippreamb int min = 0; int max = lmt_token_memory_state.tokens_data.top; int skip = 0; + int tail = p; + int count = 0; if (skippreamble) { skip = get_token_parameters(pp); } @@ -3210,7 +3210,8 @@ char *tex_tokenlist_to_tstring(int pp, int inhibit_par, int *siz, int skippreamb if (txt < 0 || txt >= lmt_string_pool_state.string_pool_data.ptr) { tex_aux_append_str_to_buffer(error_string_nonexistent(36)); } else { - char *sh = tex_makecstring(txt); + int allocated = 0; + char *sh = tex_makecstring(txt, &allocated); char *s = sh; if (tex_is_active_cs(txt)) { s = s + 3; @@ -3219,7 +3220,7 @@ char *tex_tokenlist_to_tstring(int pp, int inhibit_par, int *siz, int skippreamb s++; } } else { - if (e >= 0 && e < 0x110000) { + if (e >= 0) { tex_aux_append_uchar_to_buffer(e); } while (*s) { @@ -3230,10 +3231,14 @@ char *tex_tokenlist_to_tstring(int pp, int inhibit_par, int *siz, int skippreamb tex_aux_append_char_to_buffer(' '); } } - lmt_memory_free(sh); + if (allocated) { + lmt_memory_free(sh); + } } } } + tail = p; + ++count; p = token_link(p); } } @@ -3251,7 +3256,14 @@ char *tex_tokenlist_to_tstring(int pp, int inhibit_par, int *siz, int skippreamb if (siz) { *siz = lmt_token_state.bufloc; } + if (wipe) { + tex_flush_token_list_head_tail(pp, tail, count); + } return lmt_token_state.buffer; + } else { + if (wipe) { + tex_put_available_token(pp); + } } } if (siz) { diff --git a/source/luametatex/source/tex/textoken.h b/source/luametatex/source/tex/textoken.h index 1996f351c..ad67dfcb5 100644 --- a/source/luametatex/source/tex/textoken.h +++ b/source/luametatex/source/tex/textoken.h @@ -366,8 +366,7 @@ extern void tex_run_combine_the_toks (void); extern void tex_run_convert_tokens (halfword code); extern strnumber tex_the_convert_string (halfword c, int i); extern strnumber tex_tokens_to_string (halfword p); -/* char *tex_tokenlist_to_cstring (int p, int inhibit_par, int *siz); */ -extern char *tex_tokenlist_to_tstring (int p, int inhibit_par, int *siz, int skip, int nospace, int strip); +extern char *tex_tokenlist_to_tstring (int p, int inhibit_par, int *siz, int skip, int nospace, int strip, int wipe); extern halfword tex_get_tex_dimen_register (int j, int internal); extern halfword tex_get_tex_skip_register (int j, int internal); @@ -391,9 +390,6 @@ extern halfword tex_copy_token_list (halfword h, halfword *t); extern halfword tex_parse_str_to_tok (halfword head, halfword *tail, halfword ct, const char *str, size_t lstr, int option); -inline int tex_valid_token(int t) -{ - return ((t >= 0) && (t <= (int) lmt_token_memory_state.tokens_data.top)); -} +inline int tex_valid_token (int t) { return ((t >= 0) && (t <= (int) lmt_token_memory_state.tokens_data.top)); } # endif diff --git a/source/luametatex/source/utilities/auxunistring.c b/source/luametatex/source/utilities/auxunistring.c index e95854a93..30dc518e6 100644 --- a/source/luametatex/source/utilities/auxunistring.c +++ b/source/luametatex/source/utilities/auxunistring.c @@ -52,15 +52,12 @@ unsigned char *aux_uni2str(unsigned unic) buf[0] = (unsigned char) (0xc0 | (unic >> 6)); buf[1] = (unsigned char) (0x80 | (unic & 0x3f)); buf[2] = '\0'; - } else if (unic >= 0x110000) { - buf[0] = (unsigned char) (unic - 0x110000); - buf[1] = '\0'; } else if (unic < 0x10000) { buf[0] = (unsigned char) (0xe0 | (unic >> 12)); buf[1] = (unsigned char) (0x80 | ((unic >> 6) & 0x3f)); buf[2] = (unsigned char) (0x80 | (unic & 0x3f)); buf[3] = '\0'; - } else { + } else if (unic < 0x110000) { unic -= 0x10000; int u = (int) (((unic & 0xf0000) >> 16) + 1); buf[0] = (unsigned char) (0xf0 | (u >> 2)); diff --git a/tex/context/base/mkii/cont-new.mkii b/tex/context/base/mkii/cont-new.mkii index e1de3bd24..506b3f703 100644 --- a/tex/context/base/mkii/cont-new.mkii +++ b/tex/context/base/mkii/cont-new.mkii @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2022.10.15 10:32} +\newcontextversion{2022.10.21 21:11} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/mkii/context.mkii b/tex/context/base/mkii/context.mkii index 85524aa83..828709ead 100644 --- a/tex/context/base/mkii/context.mkii +++ b/tex/context/base/mkii/context.mkii @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2022.10.15 10:32} +\edef\contextversion{2022.10.21 21:11} %D For those who want to use this: diff --git a/tex/context/base/mkii/mult-cs.mkii b/tex/context/base/mkii/mult-cs.mkii index b5e93a66c..8f5571627 100644 --- a/tex/context/base/mkii/mult-cs.mkii +++ b/tex/context/base/mkii/mult-cs.mkii @@ -93,7 +93,6 @@ \setinterfacevariable{author}{autor} \setinterfacevariable{auto}{auto} \setinterfacevariable{autointro}{autouvod} -\setinterfacevariable{autopunctuation}{autopunctuation} \setinterfacevariable{back}{zpet} \setinterfacevariable{background}{pozadi} \setinterfacevariable{backmatter}{epilogy} @@ -677,9 +676,13 @@ \setinterfaceconstant{authoretaltext}{authoretaltext} \setinterfaceconstant{auto}{auto} \setinterfaceconstant{autocase}{autocase} +\setinterfaceconstant{autofencing}{autofencing} \setinterfaceconstant{autofile}{autofile} \setinterfaceconstant{autofocus}{autoostreni} \setinterfaceconstant{autohang}{autohang} +\setinterfaceconstant{autonumbers}{autonumbers} +\setinterfaceconstant{autopunctuation}{autopunctuation} +\setinterfaceconstant{autospacing}{autospacing} \setinterfaceconstant{autostrut}{autostrut} \setinterfaceconstant{autowidth}{autosirka} \setinterfaceconstant{availableheight}{availableheight} diff --git a/tex/context/base/mkii/mult-it.mkii b/tex/context/base/mkii/mult-it.mkii index 18840146a..cb91a058e 100644 --- a/tex/context/base/mkii/mult-it.mkii +++ b/tex/context/base/mkii/mult-it.mkii @@ -676,6 +676,7 @@ \setinterfaceconstant{authoretaltext}{authoretaltext} \setinterfaceconstant{auto}{auto} \setinterfaceconstant{autocase}{autocase} +\setinterfaceconstant{autofencing}{autofencing} \setinterfaceconstant{autofile}{autofile} \setinterfaceconstant{autofocus}{autofocus} \setinterfaceconstant{autohang}{autohang} diff --git a/tex/context/base/mkiv/char-ini.lua b/tex/context/base/mkiv/char-ini.lua index 4deb21401..6fe56a062 100644 --- a/tex/context/base/mkiv/char-ini.lua +++ b/tex/context/base/mkiv/char-ini.lua @@ -406,24 +406,24 @@ local blocks = allocate { ["lisusupplement"] = { first = 0x11FB0, last = 0x11FBF, description = "Lisu Supplement" }, ["lowercasebold"] = { first = 0x1D41A, last = 0x1D433, math = true }, ["lowercaseboldfraktur"] = { first = 0x1D586, last = 0x1D59F, math = true }, - ["lowercasebolditalic"] = { first = 0x1D482, last = 0x1D49B, math = true }, - ["lowercaseboldscript"] = { first = 0x1D4EA, last = 0x1D503, math = true }, + ["lowercasebolditalic"] = { first = 0x1D482, last = 0x1D49B, math = true, italic = true }, + ["lowercaseboldscript"] = { first = 0x1D4EA, last = 0x1D503, math = true, italic = true }, ["lowercasedoublestruck"] = { first = 0x1D552, last = 0x1D56B, math = true }, ["lowercasefraktur"] = { first = 0x1D51E, last = 0x1D537, math = true }, ["lowercasegreekbold"] = { first = 0x1D6C2, last = 0x1D6DB, math = true }, - ["lowercasegreekbolditalic"] = { first = 0x1D736, last = 0x1D74F, math = true }, - ["lowercasegreekitalic"] = { first = 0x1D6FC, last = 0x1D715, math = true }, + ["lowercasegreekbolditalic"] = { first = 0x1D736, last = 0x1D74F, math = true, italic = true }, + ["lowercasegreekitalic"] = { first = 0x1D6FC, last = 0x1D715, math = true, italic = true }, ["lowercasegreeknormal"] = { first = 0x003B1, last = 0x003C9, math = true }, ["lowercasegreeksansserifbold"] = { first = 0x1D770, last = 0x1D789, math = true }, - ["lowercasegreeksansserifbolditalic"] = { first = 0x1D7AA, last = 0x1D7C3, math = true }, - ["lowercaseitalic"] = { first = 0x1D44E, last = 0x1D467, math = true }, + ["lowercasegreeksansserifbolditalic"] = { first = 0x1D7AA, last = 0x1D7C3, math = true, italic = true }, + ["lowercaseitalic"] = { first = 0x1D44E, last = 0x1D467, math = true, italic = true }, ["lowercasemonospace"] = { first = 0x1D68A, last = 0x1D6A3, math = true }, ["lowercasenormal"] = { first = 0x00061, last = 0x0007A, math = true }, ["lowercasesansserifbold"] = { first = 0x1D5EE, last = 0x1D607, math = true }, - ["lowercasesansserifbolditalic"] = { first = 0x1D656, last = 0x1D66F, math = true }, - ["lowercasesansserifitalic"] = { first = 0x1D622, last = 0x1D63B, math = true }, + ["lowercasesansserifbolditalic"] = { first = 0x1D656, last = 0x1D66F, math = true, italic = true }, + ["lowercasesansserifitalic"] = { first = 0x1D622, last = 0x1D63B, math = true, italic = true }, ["lowercasesansserifnormal"] = { first = 0x1D5BA, last = 0x1D5D3, math = true }, - ["lowercasescript"] = { first = 0x1D4B6, last = 0x1D4CF, math = true }, + ["lowercasescript"] = { first = 0x1D4B6, last = 0x1D4CF, math = true, italic = true }, ["lowsurrogates"] = { first = 0x0DC00, last = 0x0DFFF, description = "Low Surrogates" }, ["lycian"] = { first = 0x10280, last = 0x1029F, description = "Lycian" }, ["lydian"] = { first = 0x10920, last = 0x1093F, description = "Lydian" }, @@ -561,24 +561,24 @@ local blocks = allocate { ["unifiedcanadianaboriginalsyllabicsextendeda"] = { first = 0x11AB0, last = 0x11ABF, description = "Unified Canadian Aboriginal Syllabics Extended-A" }, ["uppercasebold"] = { first = 0x1D400, last = 0x1D419, math = true }, ["uppercaseboldfraktur"] = { first = 0x1D56C, last = 0x1D585, math = true }, - ["uppercasebolditalic"] = { first = 0x1D468, last = 0x1D481, math = true }, - ["uppercaseboldscript"] = { first = 0x1D4D0, last = 0x1D4E9, math = true }, + ["uppercasebolditalic"] = { first = 0x1D468, last = 0x1D481, math = true, italic = true }, + ["uppercaseboldscript"] = { first = 0x1D4D0, last = 0x1D4E9, math = true, italic = true }, ["uppercasedoublestruck"] = { first = 0x1D538, last = 0x1D551, math = true }, -- gaps are filled in elsewhere ["uppercasefraktur"] = { first = 0x1D504, last = 0x1D51D, math = true }, ["uppercasegreekbold"] = { first = 0x1D6A8, last = 0x1D6C1, math = true }, - ["uppercasegreekbolditalic"] = { first = 0x1D71C, last = 0x1D735, math = true }, - ["uppercasegreekitalic"] = { first = 0x1D6E2, last = 0x1D6FB, math = true }, + ["uppercasegreekbolditalic"] = { first = 0x1D71C, last = 0x1D735, math = true, italic = true }, + ["uppercasegreekitalic"] = { first = 0x1D6E2, last = 0x1D6FB, math = true, italic = true }, ["uppercasegreeknormal"] = { first = 0x00391, last = 0x003AA, math = true }, ["uppercasegreeksansserifbold"] = { first = 0x1D756, last = 0x1D76F, math = true }, - ["uppercasegreeksansserifbolditalic"] = { first = 0x1D790, last = 0x1D7A9, math = true }, - ["uppercaseitalic"] = { first = 0x1D434, last = 0x1D44D, math = true }, + ["uppercasegreeksansserifbolditalic"] = { first = 0x1D790, last = 0x1D7A9, math = true, italic = true }, + ["uppercaseitalic"] = { first = 0x1D434, last = 0x1D44D, math = true, italic = true }, ["uppercasemonospace"] = { first = 0x1D670, last = 0x1D689, math = true }, ["uppercasenormal"] = { first = 0x00041, last = 0x0005A, math = true }, ["uppercasesansserifbold"] = { first = 0x1D5D4, last = 0x1D5ED, math = true }, - ["uppercasesansserifbolditalic"] = { first = 0x1D63C, last = 0x1D655, math = true }, - ["uppercasesansserifitalic"] = { first = 0x1D608, last = 0x1D621, math = true }, + ["uppercasesansserifbolditalic"] = { first = 0x1D63C, last = 0x1D655, math = true, italic = true }, + ["uppercasesansserifitalic"] = { first = 0x1D608, last = 0x1D621, math = true, italic = true }, ["uppercasesansserifnormal"] = { first = 0x1D5A0, last = 0x1D5B9, math = true }, - ["uppercasescript"] = { first = 0x1D49C, last = 0x1D4B5, math = true }, + ["uppercasescript"] = { first = 0x1D49C, last = 0x1D4B5, math = true, italic = true }, ["vai"] = { first = 0x0A500, last = 0x0A63F, description = "Vai" }, ["variationselectors"] = { first = 0x0FE00, last = 0x0FE0F, description = "Variation Selectors" }, ["variationselectorssupplement"] = { first = 0xE0100, last = 0xE01EF, description = "Variation Selectors Supplement" }, diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv index 400fc6983..191926e8f 100644 --- a/tex/context/base/mkiv/cont-new.mkiv +++ b/tex/context/base/mkiv/cont-new.mkiv @@ -13,7 +13,7 @@ % \normalend % uncomment this to get the real base runtime -\newcontextversion{2022.10.15 10:32} +\newcontextversion{2022.10.21 21:11} %D This file is loaded at runtime, thereby providing an excellent place for hacks, %D patches, extensions and new features. There can be local overloads in cont-loc diff --git a/tex/context/base/mkiv/context.mkiv b/tex/context/base/mkiv/context.mkiv index e0608818f..5dfadb660 100644 --- a/tex/context/base/mkiv/context.mkiv +++ b/tex/context/base/mkiv/context.mkiv @@ -49,7 +49,7 @@ %D {YYYY.MM.DD HH:MM} format. \edef\contextformat {\jobname} -\edef\contextversion{2022.10.15 10:32} +\edef\contextversion{2022.10.21 21:11} %D Kind of special: diff --git a/tex/context/base/mkiv/font-con.lua b/tex/context/base/mkiv/font-con.lua index f650e5b03..5c156c2ba 100644 --- a/tex/context/base/mkiv/font-con.lua +++ b/tex/context/base/mkiv/font-con.lua @@ -534,7 +534,6 @@ function constructors.scale(tfmdata,specification) local realdimensions = properties.realdimensions local writingmode = properties.writingmode or "horizontal" local identity = properties.identity or "horizontal" - -- local vfonts = target.fonts if vfonts and #vfonts > 0 then target.fonts = fastcopy(vfonts) -- maybe we virtualize more afterwards diff --git a/tex/context/base/mkiv/font-ctx.lua b/tex/context/base/mkiv/font-ctx.lua index eead8abff..2c56b5613 100644 --- a/tex/context/base/mkiv/font-ctx.lua +++ b/tex/context/base/mkiv/font-ctx.lua @@ -1411,7 +1411,7 @@ do -- else too many locals context(function() busy = false mathematics.finishfallbacks(tfmdata,specification,fallbacks) -tfmdata.original = specification.specification + tfmdata.original = specification.specification local id = definefont(tfmdata) csnames[id] = specification.cs properties.id = id @@ -1449,7 +1449,7 @@ tfmdata.original = specification.specification end) return else -tfmdata.original = specification.specification + tfmdata.original = specification.specification local id = definefont(tfmdata) csnames[id] = specification.cs properties.id = id diff --git a/tex/context/base/mkiv/font-imp-italics.lua b/tex/context/base/mkiv/font-imp-italics.lua index 10a419daf..8b38c5893 100644 --- a/tex/context/base/mkiv/font-imp-italics.lua +++ b/tex/context/base/mkiv/font-imp-italics.lua @@ -13,29 +13,32 @@ local handlers = fonts.handlers local registerotffeature = handlers.otf.features.register local registerafmfeature = handlers.afm.features.register -local function initialize(tfmdata,key,value) - local factor = tonumber(value) or 1 - for unicode, character in next, tfmdata.characters do - local olditalic = character.italic - if olditalic and olditalic ~= 0 then - character.width = character.width + olditalic - character.italic = 0 - character.bottomright = -factor * olditalic - end - end -end - -local specification = { - name = "italicwidths", - description = "add italic to width", - manipulators = { - base = initialize, - node = initialize, -- only makes sense for math - } -} - -registerotffeature(specification) -registerafmfeature(specification) +-- This is a precursor to what we do in lmtx now via tweaks but at some point I +-- might make this a mkiv features too using staircase kerns. + +-- local function initialize(tfmdata,key,value) +-- local factor = tonumber(value) or 1 +-- for unicode, character in next, tfmdata.characters do +-- local olditalic = character.italic +-- if olditalic and olditalic ~= 0 then +-- character.width = character.width + olditalic +-- character.italic = 0 +-- character.bottomright = -factor * olditalic -- lmtx only +-- end +-- end +-- end +-- +-- local specification = { +-- name = "italicwidths", +-- description = "add italic to width", +-- manipulators = { +-- base = initialize, +-- node = initialize, -- only makes sense for math +-- } +-- } +-- +-- registerotffeature(specification) +-- registerafmfeature(specification) local function initialize(tfmdata,value) -- hm, always value if value then diff --git a/tex/context/base/mkiv/font-imp-math.lua b/tex/context/base/mkiv/font-imp-math.lua index c0185ca34..624f39f02 100644 --- a/tex/context/base/mkiv/font-imp-math.lua +++ b/tex/context/base/mkiv/font-imp-math.lua @@ -16,57 +16,41 @@ local registerotffeature = fonts.handlers.otf.features.register local setmetatableindex = table.setmetatableindex --- requested for latex but not supported unless really needed in context: +-- local splitter = lpeg.splitat(",",tonumber) +-- local lpegmatch = lpeg.match -- --- registerotffeature { --- name = "ignoremathconstants", --- description = "ignore math constants table", --- initializers = { --- base = function(tfmdata,value) --- if value then --- tfmdata.mathparameters = nil +-- local function initialize(tfmdata,value) +-- local mathparameters = tfmdata.mathparameters +-- if mathparameters then +-- local sup, sub +-- if type(value) == "string" then +-- sup, sub = lpegmatch(splitter,value) +-- if not sup then +-- sub, sup = 0, 0 +-- elseif not sub then +-- sub, sup = sup, 0 -- end +-- elseif type(value) == "number" then +-- sup, sub = 0, value +-- end +-- if sup then +-- mathparameters.NoLimitSupFactor = sup -- end +-- if sub then +-- mathparameters.NoLimitSubFactor = sub +-- end +-- end +-- end +-- +-- registerotffeature { +-- name = "mathnolimitsmode", +-- description = "influence nolimits placement", +-- initializers = { +-- base = initialize, +-- node = initialize, -- } -- } --- tfmdata.properties.mathnolimitsmode = tonumber(value) or 0 - -local splitter = lpeg.splitat(",",tonumber) -local lpegmatch = lpeg.match - -local function initialize(tfmdata,value) - local mathparameters = tfmdata.mathparameters - if mathparameters then - local sup, sub - if type(value) == "string" then - sup, sub = lpegmatch(splitter,value) - if not sup then - sub, sup = 0, 0 - elseif not sub then - sub, sup = sup, 0 - end - elseif type(value) == "number" then - sup, sub = 0, value - end - if sup then - mathparameters.NoLimitSupFactor = sup - end - if sub then - mathparameters.NoLimitSubFactor = sub - end - end -end - -registerotffeature { - name = "mathnolimitsmode", - description = "influence nolimits placement", - initializers = { - base = initialize, - node = initialize, - } -} - local function initialize(tfmdata,value) tfmdata.properties.nostackmath = value and true end diff --git a/tex/context/base/mkiv/font-pre.mkiv b/tex/context/base/mkiv/font-pre.mkiv index 445dedd25..5cd107c23 100644 --- a/tex/context/base/mkiv/font-pre.mkiv +++ b/tex/context/base/mkiv/font-pre.mkiv @@ -401,10 +401,11 @@ % liga=yes, % makes no sense % tlig=yes, % makes no sense % trep=yes, % makes no sense - mathnolimitsmode={0,800}, % this looks okay on the average font + % mathnolimitsmode={0,800}, % this looks okay on the average font mathalternates=yes, - mathitalics=yes, % we pass them - mathdimensions=all, + emulatelmtx=yes, + % mathitalics=yes, % we pass them + % mathdimensions=all, % mathkerns=yes, % mathgaps=yes, language=dflt, diff --git a/tex/context/base/mkiv/good-mth.lua b/tex/context/base/mkiv/good-mth.lua index 751ab2438..e25782e9e 100644 --- a/tex/context/base/mkiv/good-mth.lua +++ b/tex/context/base/mkiv/good-mth.lua @@ -1,4 +1,4 @@ -if not modules then modules = { } end modules ['good-mth'] = { + if not modules then modules = { } end modules ['good-mth'] = { version = 1.000, comment = "companion to font-lib.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", @@ -47,151 +47,151 @@ local prependcommands = helpers.prependcommands -- experiment, we have to load the definitions immediately as they precede -- the definition so they need to be initialized in the typescript -local function withscriptcode(tfmdata,unicode,data,action) - if type(unicode) == "string" then - local p, u = match(unicode,"^(.-):(.-)$") - if u then - u = tonumber(u) - if u then - local slots = fonts.helpers.mathscriptslots(tfmdata,u) - if slots then - if p == "*" then - action(u,data) - for i=1,#slots do - action(slots[i],data) - end - else - p = tonumber(p) - if p then - action(slots[p],data) - end - end - end - end - end - else - action(unicode,data) - end -end - -local function finalize(tfmdata,feature,value) --- if tfmdata.mathparameters then -- funny, cambria text has this - local goodies = tfmdata.goodies - if goodies then - local virtualized = mathematics.virtualized - for i=1,#goodies do - local goodie = goodies[i] - local mathematics = goodie.mathematics - local dimensions = mathematics and mathematics.dimensions - if dimensions then - if trace_defining then - report_math("overloading dimensions in %a @ %p",tfmdata.properties.fullname,tfmdata.parameters.size) - end - local characters = tfmdata.characters - local descriptions = tfmdata.descriptions - local parameters = tfmdata.parameters - local factor = parameters.factor - local hfactor = parameters.hfactor - local vfactor = parameters.vfactor - local function overloadone(unicode,data) - local character = characters[unicode] - if not character then - local c = virtualized[unicode] - if c then - character = characters[c] - end - end - if character then - local width = data.width - local height = data.height - local depth = data.depth - if trace_defining and (width or height or depth) then - report_math("overloading dimensions of %C, width %p, height %p, depth %p", - unicode,width or 0,height or 0,depth or 0) - end - if width then character.width = width * hfactor end - if height then character.height = height * vfactor end - if depth then character.depth = depth * vfactor end - -- - local xoffset = data.xoffset - local yoffset = data.yoffset - if xoffset == "llx" then - local d = descriptions[unicode] - if d then - xoffset = - d.boundingbox[1] * hfactor - character.width = character.width + xoffset - xoffset = rightcommand[xoffset] - else - xoffset = nil - end - elseif xoffset and xoffset ~= 0 then - xoffset = rightcommand[xoffset * hfactor] - else - xoffset = nil - end - if yoffset and yoffset ~= 0 then - yoffset = upcommand[yoffset * vfactor] - else - yoffset = nil - end - if xoffset or yoffset then - local commands = character.commands - if commands then - prependcommands(commands,yoffset,xoffset) - else - local slot = charcommand[unicode] - if xoffset and yoffset then - character.commands = { xoffset, yoffset, slot } - elseif xoffset then - character.commands = { xoffset, slot } - else - character.commands = { yoffset, slot } - end - end - end - elseif trace_defining then - report_math("no overloading dimensions of %C, not in font",unicode) - end - end - local function overload(dimensions) - for unicode, data in next, dimensions do - withscriptcode(tfmdata,unicode,data,overloadone) - end - end - if value == nil then - value = { "default" } - end - if value == "all" or value == true then - for name, value in next, dimensions do - overload(value) - end - else - if type(value) == "string" then - value = utilities.parsers.settings_to_array(value) - end - if type(value) == "table" then - for i=1,#value do - local d = dimensions[value[i]] - if d then - overload(d) - end - end - end - end - end - end - end -end +-- local function withscriptcode(tfmdata,unicode,data,action) +-- if type(unicode) == "string" then +-- local p, u = match(unicode,"^(.-):(.-)$") +-- if u then +-- u = tonumber(u) +-- if u then +-- local slots = fonts.helpers.mathscriptslots(tfmdata,u) +-- if slots then +-- if p == "*" then +-- action(u,data) +-- for i=1,#slots do +-- action(slots[i],data) +-- end +-- else +-- p = tonumber(p) +-- if p then +-- action(slots[p],data) +-- end +-- end +-- end +-- end +-- end +-- else +-- action(unicode,data) +-- end +-- end -registerotffeature { - name = "mathdimensions", - description = "manipulate math dimensions", - -- default = true, - manipulators = { - base = finalize, - node = finalize, - } -} +-- local function finalize(tfmdata,feature,value) +-- -- if tfmdata.mathparameters then -- funny, cambria text has this +-- local goodies = tfmdata.goodies +-- if goodies then +-- local virtualized = mathematics.virtualized +-- for i=1,#goodies do +-- local goodie = goodies[i] +-- local mathematics = goodie.mathematics +-- local dimensions = mathematics and mathematics.dimensions +-- if dimensions then +-- if trace_defining then +-- report_math("overloading dimensions in %a @ %p",tfmdata.properties.fullname,tfmdata.parameters.size) +-- end +-- local characters = tfmdata.characters +-- local descriptions = tfmdata.descriptions +-- local parameters = tfmdata.parameters +-- local factor = parameters.factor +-- local hfactor = parameters.hfactor +-- local vfactor = parameters.vfactor +-- local function overloadone(unicode,data) +-- local character = characters[unicode] +-- if not character then +-- local c = virtualized[unicode] +-- if c then +-- character = characters[c] +-- end +-- end +-- if character then +-- local width = data.width +-- local height = data.height +-- local depth = data.depth +-- if trace_defining and (width or height or depth) then +-- report_math("overloading dimensions of %C, width %p, height %p, depth %p", +-- unicode,width or 0,height or 0,depth or 0) +-- end +-- if width then character.width = width * hfactor end +-- if height then character.height = height * vfactor end +-- if depth then character.depth = depth * vfactor end +-- -- +-- local xoffset = data.xoffset +-- local yoffset = data.yoffset +-- if xoffset == "llx" then +-- local d = descriptions[unicode] +-- if d then +-- xoffset = - d.boundingbox[1] * hfactor +-- character.width = character.width + xoffset +-- xoffset = rightcommand[xoffset] +-- else +-- xoffset = nil +-- end +-- elseif xoffset and xoffset ~= 0 then +-- xoffset = rightcommand[xoffset * hfactor] +-- else +-- xoffset = nil +-- end +-- if yoffset and yoffset ~= 0 then +-- yoffset = upcommand[yoffset * vfactor] +-- else +-- yoffset = nil +-- end +-- if xoffset or yoffset then +-- local commands = character.commands +-- if commands then +-- prependcommands(commands,yoffset,xoffset) +-- else +-- local slot = charcommand[unicode] +-- if xoffset and yoffset then +-- character.commands = { xoffset, yoffset, slot } +-- elseif xoffset then +-- character.commands = { xoffset, slot } +-- else +-- character.commands = { yoffset, slot } +-- end +-- end +-- end +-- elseif trace_defining then +-- report_math("no overloading dimensions of %C, not in font",unicode) +-- end +-- end +-- local function overload(dimensions) +-- for unicode, data in next, dimensions do +-- withscriptcode(tfmdata,unicode,data,overloadone) +-- end +-- end +-- if value == nil then +-- value = { "default" } +-- end +-- if value == "all" or value == true then +-- for name, value in next, dimensions do +-- overload(value) +-- end +-- else +-- if type(value) == "string" then +-- value = utilities.parsers.settings_to_array(value) +-- end +-- if type(value) == "table" then +-- for i=1,#value do +-- local d = dimensions[value[i]] +-- if d then +-- overload(d) +-- end +-- end +-- end +-- end +-- end +-- end +-- end +-- end +-- +-- registerotffeature { +-- name = "mathdimensions", +-- description = "manipulate math dimensions", +-- -- default = true, +-- manipulators = { +-- base = finalize, +-- node = finalize, +-- } +-- } local function initialize(goodies) local mathgoodies = goodies.mathematics @@ -222,119 +222,117 @@ fontgoodies.register("mathematics", initialize) -- local enabled = false directives.register("fontgoodies.mathkerning",function(v) enabled = v end) -local function initialize(tfmdata) --- if enabled and tfmdata.mathparameters then -- funny, cambria text has this - if tfmdata.mathparameters then -- funny, cambria text has this - local goodies = tfmdata.goodies - if goodies then - local characters = tfmdata.characters - if characters[0x1D44E] then -- 119886 - -- we have at least an italic a - for i=1,#goodies do - local mathgoodies = goodies[i].mathematics - if mathgoodies then - local kerns = mathgoodies.kerns - if kerns then - local function kernone(unicode,data) - local chardata = characters[unicode] - if chardata and (not chardata.mathkerns or data.force) then - chardata.mathkerns = data - end - end - for unicode, data in next, kerns do - withscriptcode(tfmdata,unicode,data,kernone) - end - return - end - end - end - else - return -- no proper math font anyway - end - end - end -end - -registerotffeature { - name = "mathkerns", - description = "math kerns", - -- default = true, - initializers = { - base = initialize, - node = initialize, - } -} - --- math italics (not really needed) +-- local function initialize(tfmdata) +-- -- if enabled and tfmdata.mathparameters then -- funny, cambria text has this +-- if tfmdata.mathparameters then -- funny, cambria text has this +-- local goodies = tfmdata.goodies +-- if goodies then +-- local characters = tfmdata.characters +-- if characters[0x1D44E] then -- 119886 +-- -- we have at least an italic a +-- for i=1,#goodies do +-- local mathgoodies = goodies[i].mathematics +-- if mathgoodies then +-- local kerns = mathgoodies.kerns +-- if kerns then +-- local function kernone(unicode,data) +-- local chardata = characters[unicode] +-- if chardata and (not chardata.mathkerns or data.force) then +-- chardata.mathkerns = data +-- end +-- end +-- for unicode, data in next, kerns do +-- withscriptcode(tfmdata,unicode,data,kernone) +-- end +-- return +-- end +-- end +-- end +-- else +-- return -- no proper math font anyway +-- end +-- end +-- end +-- end -- --- it would be nice to have a \noitalics\font option +-- registerotffeature { +-- name = "mathkerns", +-- description = "math kerns", +-- -- default = true, +-- initializers = { +-- base = initialize, +-- node = initialize, +-- } +-- } -local function initialize(tfmdata) - local goodies = tfmdata.goodies - if goodies then - local shared = tfmdata.shared - for i=1,#goodies do - local mathgoodies = goodies[i].mathematics - if mathgoodies then - local mathitalics = mathgoodies.italics - if mathitalics then - local properties = tfmdata.properties - if properties.setitalics then - mathitalics = mathitalics[file.nameonly(properties.name)] or mathitalics - if mathitalics then - if trace_goodies then - report_goodies("loading mathitalics for font %a",properties.name) - end - local corrections = mathitalics.corrections - local defaultfactor = mathitalics.defaultfactor - -- properties.mathitalic_defaultfactor = defaultfactor -- we inherit outer one anyway (name will change) - if corrections then - fontgoodies.registerpostprocessor(tfmdata, function(tfmdata) -- this is another tfmdata (a copy) - -- better make a helper so that we have less code being defined - local properties = tfmdata.properties - local parameters = tfmdata.parameters - local characters = tfmdata.characters - properties.mathitalic_defaultfactor = defaultfactor - properties.mathitalic_defaultvalue = defaultfactor * parameters.quad - if trace_goodies then - report_goodies("assigning mathitalics for font %a",properties.name) - end - local quad = parameters.quad - local hfactor = parameters.hfactor - for k, v in next, corrections do - local c = characters[k] - if c then - if v > -1 and v < 1 then - c.italic = v * quad - else - c.italic = v * hfactor - end - else - report_goodies("invalid mathitalics entry %U for font %a",k,properties.name) - end - end - end) - end - return -- maybe not as these can accumulate - end - end - end - end - end - end -end - -registerotffeature { - name = "mathitalics", - description = "additional math italic corrections", - -- default = true, - initializers = { - base = initialize, - node = initialize, - } -} - --- fontgoodies.register("mathitalics", initialize) +-- -- math italics (not really needed) +-- -- +-- -- it would be nice to have a \noitalics\font option +-- +-- local function initialize(tfmdata) +-- local goodies = tfmdata.goodies +-- if goodies then +-- local shared = tfmdata.shared +-- for i=1,#goodies do +-- local mathgoodies = goodies[i].mathematics +-- if mathgoodies then +-- local mathitalics = mathgoodies.italics +-- if mathitalics then +-- local properties = tfmdata.properties +-- if properties.setitalics then +-- mathitalics = mathitalics[file.nameonly(properties.name)] or mathitalics +-- if mathitalics then +-- if trace_goodies then +-- report_goodies("loading mathitalics for font %a",properties.name) +-- end +-- local corrections = mathitalics.corrections +-- local defaultfactor = mathitalics.defaultfactor +-- -- properties.mathitalic_defaultfactor = defaultfactor -- we inherit outer one anyway (name will change) +-- if corrections then +-- fontgoodies.registerpostprocessor(tfmdata, function(tfmdata) -- this is another tfmdata (a copy) +-- -- better make a helper so that we have less code being defined +-- local properties = tfmdata.properties +-- local parameters = tfmdata.parameters +-- local characters = tfmdata.characters +-- properties.mathitalic_defaultfactor = defaultfactor +-- properties.mathitalic_defaultvalue = defaultfactor * parameters.quad +-- if trace_goodies then +-- report_goodies("assigning mathitalics for font %a",properties.name) +-- end +-- local quad = parameters.quad +-- local hfactor = parameters.hfactor +-- for k, v in next, corrections do +-- local c = characters[k] +-- if c then +-- if v > -1 and v < 1 then +-- c.italic = v * quad +-- else +-- c.italic = v * hfactor +-- end +-- else +-- report_goodies("invalid mathitalics entry %U for font %a",k,properties.name) +-- end +-- end +-- end) +-- end +-- return -- maybe not as these can accumulate +-- end +-- end +-- end +-- end +-- end +-- end +-- end +-- +-- registerotffeature { +-- name = "mathitalics", +-- description = "additional math italic corrections", +-- -- default = true, +-- initializers = { +-- base = initialize, +-- node = initialize, +-- } +-- } local function mathradicalaction(n,h,v,font,mchar,echar) local characters = fontcharacters[font] diff --git a/tex/context/base/mkiv/lpdf-ano.lua b/tex/context/base/mkiv/lpdf-ano.lua index ebed9aec6..2bc485ff1 100644 --- a/tex/context/base/mkiv/lpdf-ano.lua +++ b/tex/context/base/mkiv/lpdf-ano.lua @@ -108,6 +108,10 @@ local pdf_named = pdfconstant("Named") local autoprefix = "#" local usedautoprefixes = { } +function codeinjections.setautoprefix(prefix) + autoprefix = prefix ~= "" and prefix or autoprefix +end + local function registerautoprefix(name) local internal = autoprefix .. name if usedautoprefixes[internal] == nil then diff --git a/tex/context/base/mkiv/math-act.lua b/tex/context/base/mkiv/math-act.lua index 5aa3f0ff0..a77fdc020 100644 --- a/tex/context/base/mkiv/math-act.lua +++ b/tex/context/base/mkiv/math-act.lua @@ -6,10 +6,13 @@ if not modules then modules = { } end modules ['math-act'] = { license = "see context related readme files" } --- Here we tweak some font properties (if needed). +-- Here we tweak some font properties (if needed). Per mid octover 2022 we also provide +-- an lmtx emulation mode which means that we removed some other code. Some of that was +-- experimental, some transitional, some is now obsolete). Using emulation mode also +-- means that we are unlikely to test some aspects of the math engines extensively. local type, next = type, next -local fastcopy, insert, remove = table.fastcopy, table.insert, table.remove +local fastcopy, insert, remove, copytable = table.fastcopy, table.insert, table.remove, table.copy local formatters = string.formatters local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end) @@ -75,41 +78,43 @@ local how = { NoLimitSubFactor = "unscaled", } -function mathematics.scaleparameters(target,original) - if not target.properties.math_is_scaled then - local mathparameters = target.mathparameters - if mathparameters and next(mathparameters) then - local parameters = target.parameters - local factor = parameters.factor - local hfactor = parameters.hfactor - local vfactor = parameters.vfactor - for name, value in next, mathparameters do - local h = how[name] - if h == "unscaled" then - -- kept - elseif h == "horizontal" then - value = value * hfactor - elseif h == "vertical"then - value = value * vfactor - else - value = value * factor - end - mathparameters[name] = value +local function scaleparameters(mathparameters,parameters) + if mathparameters and next(mathparameters) and parameters then + local factor = parameters.factor + local hfactor = parameters.hfactor + local vfactor = parameters.vfactor + for name, value in next, mathparameters do + local h = how[name] + if h == "unscaled" then + -- kept + elseif h == "horizontal" then + value = value * hfactor + elseif h == "vertical"then + value = value * vfactor + else + value = value * factor end + mathparameters[name] = value end - target.properties.math_is_scaled = true end end --- AccentBaseHeight vs FlattenedAccentBaseHeight - -function mathematics.checkaccentbaseheight(target,original) - local mathparameters = target.mathparameters - if mathparameters and mathparameters.AccentBaseHeight == 0 then - mathparameters.AccentBaseHeight = target.parameters.x_height -- needs checking +function mathematics.scaleparameters(target,original) + if not target.properties.math_is_scaled then + scaleparameters(target.mathparameters,target.parameters) + target.properties.math_is_scaled = true end end +-- -- AccentBaseHeight vs FlattenedAccentBaseHeight +-- +-- function mathematics.checkaccentbaseheight(target,original) +-- local mathparameters = target.mathparameters +-- if mathparameters and mathparameters.AccentBaseHeight == 0 then +-- mathparameters.AccentBaseHeight = target.parameters.x_height -- needs checking +-- end +-- end + function mathematics.checkprivateparameters(target,original) local mathparameters = target.mathparameters if mathparameters then @@ -180,29 +185,65 @@ function mathematics.overloadparameters(target,original) end end +local mathtweaks = { subsets = table.setmetatableindex("table") } +mathematics.tweaks = mathtweaks + +local apply_tweaks = true + +directives.register("math.applytweaks", function(v) + apply_tweaks = v; +end) + local function applytweaks(when,target,original) - local goodies = original.goodies - if goodies then - for i=1,#goodies do - local goodie = goodies[i] - local mathematics = goodie.mathematics - local tweaks = mathematics and mathematics.tweaks - if type(tweaks) == "table" then - tweaks = tweaks[when] - if type(tweaks) == "table" then - if trace_defining then - report_math("tweaking math of %a @ %p (%s)",target.properties.fullname,target.parameters.size,when) - end - for i=1,#tweaks do - local tweak= tweaks[i] - local tvalue = type(tweak) - if tvalue == "function" then - tweak(target,original) + if apply_tweaks then + local goodies = original.goodies + if goodies then + local tweaked = target.tweaked or { } + if tweaked[when] then + if trace_defining then + report_math("tweaking math of %a @ %p (%s: %s)",target.properties.fullname,target.parameters.size,when,"done") + end + else + for i=1,#goodies do + local goodie = goodies[i] + local mathematics = goodie.mathematics + local tweaks = mathematics and mathematics.tweaks + if type(tweaks) == "table" then + tweaks = tweaks[when] + if type(tweaks) == "table" then + if trace_defining then + report_math("tweaking math of %a @ %p (%s: %s)",target.properties.fullname,target.parameters.size,when,"okay") + end + for i=1,#tweaks do + local tweak = tweaks[i] + local tvalue = type(tweak) + if type(tweak) == "table" then + local action = mathtweaks[tweak.tweak or ""] + if action then + local feature = tweak.feature + local features = target.specification.features.normal + if not feature or features[feature] == true then + local version = tweak.version + if version and version ~= target.tweakversion then + report_math("skipping tweak %a version %a",tweak.tweak,version) + elseif original then + action(target,original,tweak) + else + action(target,tweak) + end + end + end + end + end end end end + tweaked[when] = true + target.tweaked = tweaked end end + else + report_math("not tweaking math of %a @ %p (%s)",target.properties.fullname,target.parameters.size,when) end end @@ -222,118 +263,130 @@ end sequencers.appendaction("mathparameters","system","mathematics.overloadparameters") sequencers.appendaction("mathparameters","system","mathematics.scaleparameters") -sequencers.appendaction("mathparameters","system","mathematics.checkaccentbaseheight") -- should go in lfg instead +----------.appendaction("mathparameters","system","mathematics.checkaccentbaseheight") -- should go in lfg instead sequencers.appendaction("mathparameters","system","mathematics.checkprivateparameters") -- after scaling ! sequencers.appendaction("beforecopyingcharacters","system","mathematics.tweakbeforecopyingfont") sequencers.appendaction("aftercopyingcharacters", "system","mathematics.tweakaftercopyingfont") --- no, it's a feature now (see good-mth): --- --- sequencers.appendaction("aftercopyingcharacters", "system","mathematics.overloaddimensions") - --- a couple of predefined tweaks: - -local tweaks = { subsets = { } } -mathematics.tweaks = tweaks - --- function tweaks.fixbadprime(target,original) --- target.characters[0xFE325] = target.characters[0x2032] --- end - --- these could go to math-fbk - --- local virtualized = mathematics.virtualized --- --- local function accent_to_extensible(target,newchr,original,oldchr,height,depth,swap) --- local characters = target.characters --- -- if not characters[newchr] then -- xits needs an enforce --- local addprivate = fonts.helpers.addprivate --- local olddata = characters[oldchr] --- if olddata then --- if swap then --- swap = characters[swap] --- height = swap.depth --- depth = 0 --- else --- height = height or 0 --- depth = depth or 0 --- end --- local correction = swap and { "down", (olddata.height or 0) - height } or { "down", olddata.height } --- local newdata = { --- commands = { correction, { "slot", 1, oldchr } }, --- width = olddata.width, --- height = height, --- depth = depth, --- } --- characters[newchr] = newdata --- local nextglyph = olddata.next --- while nextglyph do --- local oldnextdata = characters[nextglyph] --- local newnextdata = { --- commands = { correction, { "slot", 1, nextglyph } }, --- width = oldnextdata.width, --- height = height, --- depth = depth, --- } --- local newnextglyph = addprivate(target,formatters["original-%H"](nextglyph),newnextdata) --- newdata.next = newnextglyph --- local nextnextglyph = oldnextdata.next --- if nextnextglyph == nextglyph then --- break --- else --- olddata = oldnextdata --- newdata = newnextdata --- nextglyph = nextnextglyph --- end --- end --- local hv = olddata.horiz_variants --- if hv then --- hv = fastcopy(hv) --- newdata.horiz_variants = hv --- for i=1,#hv do --- local hvi = hv[i] --- local oldglyph = hvi.glyph --- local olddata = characters[oldglyph] --- local newdata = { --- commands = { correction, { "slot", 1, oldglyph } }, --- width = olddata.width, --- height = height, --- depth = depth, --- } --- hvi.glyph = addprivate(target,formatters["original-%H"](oldglyph),newdata) --- end --- end --- end --- -- end --- end - --- function tweaks.fixoverline(target,original) --- local height, depth = 0, 0 --- local mathparameters = target.mathparameters --- if mathparameters then --- height = mathparameters.OverbarVerticalGap --- depth = mathparameters.UnderbarVerticalGap --- else --- height = target.parameters.xheight/4 --- depth = height --- end --- accent_to_extensible(target,0x203E,original,0x0305,height,depth) --- -- also crappy spacing for our purpose: push to top of baseline --- accent_to_extensible(target,0xFE3DE,original,0x23DE,height,depth,0x23DF) --- accent_to_extensible(target,0xFE3DC,original,0x23DC,height,depth,0x23DD) --- accent_to_extensible(target,0xFE3B4,original,0x23B4,height,depth,0x23B5) --- -- for symmetry --- target.characters[0xFE3DF] = original.characters[0x23DF] --- target.characters[0xFE3DD] = original.characters[0x23DD] --- target.characters[0xFE3B5] = original.characters[0x23B5] --- -- inspect(fonts.helpers.expandglyph(target.characters,0x203E)) --- -- inspect(fonts.helpers.expandglyph(target.characters,0x23DE)) --- end +do + + -- More than a year of testing, development, tweaking (and improving) fonts has resulted + -- in a math engine in \LUAMETATEX\ that is quite flexible. Basically we can drop italic + -- correction there. In \MKIV\ we can emulate this to some extend but we still need a bit + -- of mix because \LUAMETATEX\ lacks some features. A variant of the tweak below is now + -- also used in the plain code we ship. In \MKIV\ we dropped a few features that were a + -- prelude to this and, because most users switched to \LMTX, it is unlikely that other + -- tweaks wil be backported. There is also no need to adapt \LUATEX\ and eventually all + -- italic code might be removed from \LUAMETATEX\ (unless we want to be able to test the + -- alternative; I can live with a little ballast, especially because it took time to load + -- it). + + local italics = nil + local integrals = table.tohash { + 0x0222B, 0x0222C, 0x0222D, 0x0222E, 0x0222F, 0x02230, 0x02231, 0x02232, 0x02233, + 0x02A0B, 0x02A0C, 0x02A0D, 0x02A0E, 0x02A0F, 0x02A10, 0x02A11, 0x02A12, 0x02A13, + 0x02A14, 0x02A15, 0x02A16, 0x02A17, 0x02A18, 0x02A19, 0x02A1A, 0x02A1B, 0x02A1C, + 0x02320, 0x02321 + } + + function mathtweaks.emulatelmtx(target,original,parameters) + -- gaps are not known yet + if not italic then + italics = { } + local gaps = mathematics.gaps + for name, data in next, characters.blocks do + if data.math and data.italic then + for i=data.first,data.last do + italics[i] = true + local g = gaps[i] + if g then + italics[g] = true + end + end + end + end +-- table.save("temp.log", table.sortedkeys(italics)) + end + -- + local targetcharacters = target.characters + local targetdescriptions = target.descriptions + local factor = target.parameters.factor + local function getllx(u) + local d = targetdescriptions[u] + if d then + local b = d.boundingbox + if b then + local llx = b[1] + if llx < 0 then + return - llx + end + end + end + return false + end + -- beware: here we also do the weird ones + for u, c in next, targetcharacters do + local uc = c.unicode or u + if integrals[uc] then + -- skip this one + else + local accent = c.top_accent + local italic = c.italic + local width = c.width or 0 + local llx = getllx(u) + local bl, br, tl, tr + if llx then + llx = llx * factor + width = width + llx + bl = - llx + tl = bl + c.commands = { rightcommand[llx], charcommand[u] } + if accent then + accent = accent + llx + end + end + if accent then + if italics[uc] then + c.top_accent = accent + else + c.top_accent = nil + end + end + if italic and italic ~= 0 then + width = width + italic + br = - italic + end + c.width = width + if italic then + c.italic = nil + end + if bl or br or tl or tr then + -- watch out: singular and _ because we are post copying / scaling + c.mathkern = { + bottom_left = bl and { { height = 0, kern = bl } } or nil, + bottom_right = br and { { height = 0, kern = br } } or nil, + top_left = tl and { { height = c.height or 0, kern = tl } } or nil, + top_right = tr and { { height = c.height or 0, kern = tr } } or nil, + } + end + end + end + end --- sequencers.appendaction("aftercopyingcharacters", "system","mathematics.tweaks.fixoverline") -- for the moment always + function mathtweaks.parameters(target,original,parameters) + local newparameters = parameters.list + local oldparameters = target.mathparameters + if newparameters and oldparameters then + newparameters = copytable(newparameters) + scaleparameters(newparameters,target.parameters) + for name, newvalue in next, newparameters do + oldparameters[name] = newvalue + end + end + end --- helpers +end local setmetatableindex = table.setmetatableindex @@ -467,87 +520,6 @@ interfaces.implement { end } --- experiment - --- check: when true, only set when present in font --- force: when false, then not set when already set - --- todo: tounicode - --- function mathematics.injectfallbacks(target,original) --- local properties = original.properties --- if properties and properties.hasmath then --- local specification = target.specification --- if specification then --- local fallbacks = specification.fallbacks --- if fallbacks then --- local definitions = fonts.collections.definitions[fallbacks] --- if definitions then --- if trace_collecting then --- report_math("adding fallback characters to font %a",specification.hash) --- end --- local definedfont = fonts.definers.internal --- local copiedglyph = fonts.handlers.vf.math.copy_glyph --- local fonts = target.fonts --- local size = specification.size -- target.size --- local characters = target.characters --- if not fonts then --- fonts = { } --- target.fonts = fonts --- if not CONTEXTLMTXMODE or CONTEXTLMTXMODE == 0 then --- target.type = "virtual" --- target.properties.virtualized = true --- end --- end --- if #fonts == 0 then --- fonts[1] = { id = 0, size = size } -- sel, will be resolved later --- end --- local done = { } --- for i=1,#definitions do --- local definition = definitions[i] --- local name = definition.font --- local start = definition.start --- local stop = definition.stop --- local gaps = definition.gaps --- local check = definition.check --- local force = definition.force --- local rscale = definition.rscale or 1 --- local offset = definition.offset or start --- local id = definedfont { name = name, size = size * rscale } --- local index = #fonts + 1 --- fonts[index] = { id = id, size = size } --- local chars = fontchars[id] --- local function remap(unic,unicode,gap) --- -- local unic = unicode + offset - start --- if check and not chars[unicode] then --- -- not in font --- elseif force or (not done[unic] and not characters[unic]) then --- if trace_collecting then --- report_math("remapping math character, vector %a, font %a, character %C%s%s", --- fallbacks,name,unic,check and ", checked",gap and ", gap plugged") --- end --- characters[unic] = copiedglyph(target,characters,chars,unicode,index) --- done[unic] = true --- end --- end --- for unicode = start, stop do --- local unic = unicode + offset - start --- remap(unic,unicode,false) --- end --- if gaps then --- for unic, unicode in next, gaps do --- remap(unic,unicode,true) --- end --- end --- end --- end --- end --- end --- end --- end --- --- sequencers.appendaction("aftercopyingcharacters", "system","mathematics.finishfallbacks") - local stack = { } function mathematics.registerfallbackid(n,id,name) diff --git a/tex/context/base/mkiv/math-vfu.lua b/tex/context/base/mkiv/math-vfu.lua index 221bbff89..f282005fc 100644 --- a/tex/context/base/mkiv/math-vfu.lua +++ b/tex/context/base/mkiv/math-vfu.lua @@ -699,7 +699,7 @@ local function copy_glyph(main,target,original,unicode,slot) vvi.glyph = addprivate(main,formatters["M-V-%H"](oldglyph),newdata) end end - return newdata + return glyphdata end end diff --git a/tex/context/base/mkiv/scrn-ini.lua b/tex/context/base/mkiv/scrn-ini.lua index bf7afccb6..9c9a9f1b4 100644 --- a/tex/context/base/mkiv/scrn-ini.lua +++ b/tex/context/base/mkiv/scrn-ini.lua @@ -41,3 +41,11 @@ interfaces.implement { } } } + +interfaces.implement { + name = "setautoprefix", + actions = function(prefix) + backends.codeinjections.setautoprefix(prefix) + end, + arguments = "string", +} diff --git a/tex/context/base/mkiv/scrn-ini.mkvi b/tex/context/base/mkiv/scrn-ini.mkvi index 39fef740c..4651956a5 100644 --- a/tex/context/base/mkiv/scrn-ini.mkvi +++ b/tex/context/base/mkiv/scrn-ini.mkvi @@ -251,4 +251,8 @@ \c!keyword=, \c!date=] +\appendtoks + \clf_setautoprefix{\interactionparameter\c!prefix}% +\to \everysetupinteraction + \protect \endinput diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdf index a51e3ea39..66cc6048a 100644 Binary files a/tex/context/base/mkiv/status-files.pdf and b/tex/context/base/mkiv/status-files.pdf differ diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdf index 8c4219a01..e798b7a58 100644 Binary files a/tex/context/base/mkiv/status-lua.pdf and b/tex/context/base/mkiv/status-lua.pdf differ diff --git a/tex/context/base/mkiv/strc-lst.lua b/tex/context/base/mkiv/strc-lst.lua index 4a190132b..41d09f073 100644 --- a/tex/context/base/mkiv/strc-lst.lua +++ b/tex/context/base/mkiv/strc-lst.lua @@ -98,7 +98,10 @@ local v_reference = variables.reference local v_local = variables["local"] local v_default = variables.default --- for the moment not public -- +local cheats = { + [variables.fit] = true, + [variables.tight] = true, +} local function zerostrippedconcat(t,separator) local f = 1 @@ -196,7 +199,7 @@ local function finalizer() local i = r.internal local f = flaginternals[i] local v = usedviews[i] - if cheat and v then + if cheat and v and cheats[v] then -- cheats check added, to be tested by RKB -- this permits runs=2 with interactivity r.view = v end diff --git a/tex/context/base/mkxl/cont-new.mkxl b/tex/context/base/mkxl/cont-new.mkxl index bb6268f4a..2950090ea 100644 --- a/tex/context/base/mkxl/cont-new.mkxl +++ b/tex/context/base/mkxl/cont-new.mkxl @@ -13,7 +13,7 @@ % \normalend % uncomment this to get the real base runtime -\newcontextversion{2022.10.15 10:32} +\newcontextversion{2022.10.21 21:11} %D This file is loaded at runtime, thereby providing an excellent place for hacks, %D patches, extensions and new features. There can be local overloads in cont-loc diff --git a/tex/context/base/mkxl/context.mkxl b/tex/context/base/mkxl/context.mkxl index c322164c3..c5baad13d 100644 --- a/tex/context/base/mkxl/context.mkxl +++ b/tex/context/base/mkxl/context.mkxl @@ -29,7 +29,7 @@ %D {YYYY.MM.DD HH:MM} format. \immutable\edef\contextformat {\jobname} -\immutable\edef\contextversion{2022.10.15 10:32} +\immutable\edef\contextversion{2022.10.21 21:11} %overloadmode 1 % check frozen / warning %overloadmode 2 % check frozen / error diff --git a/tex/context/base/mkxl/driv-ini.lmt b/tex/context/base/mkxl/driv-ini.lmt index 8b6c2e5ff..c43bf2a83 100644 --- a/tex/context/base/mkxl/driv-ini.lmt +++ b/tex/context/base/mkxl/driv-ini.lmt @@ -30,6 +30,8 @@ local shipout = tex.shipout local texgetbox = tex.getbox local texgetcount = tex.getcount +local c_realpageno = tex.iscount("realpageno") + function converters.engine(driver,boxnumber,mode,number,specification) return shipout(boxnumber) end @@ -204,7 +206,7 @@ function drivers.convert(boxnumber) if currentinstance then callbacks.functions.start_page_number() starttiming(drivers) - convert(currentinstance,boxnumber,texgetcount("realpageno")) + convert(currentinstance,boxnumber,texgetcount(c_realpageno)) stoptiming(drivers) callbacks.functions.stop_page_number() end diff --git a/tex/context/base/mkxl/font-col.mklx b/tex/context/base/mkxl/font-col.mklx index 0e2f302b2..bd099bbe9 100644 --- a/tex/context/base/mkxl/font-col.mklx +++ b/tex/context/base/mkxl/font-col.mklx @@ -95,18 +95,18 @@ % math (experiment, todo clf_) -\def\font_fallbacks_register_math#1#2#3#4% - {\doifelsenothing{#3}% - {\definedfont[#2 at #4\scaledpoint]}% - {\definedfont[#2*#3\space at #4\scaledpoint]}% - \clf_registerfontfallbackid#1\space\fontid\font\space{#2}} - % \def\font_fallbacks_register_math#1#2#3#4% -% {\definedfont[#2\iftok{#3}\emptytoks\else*#3 \fi at #4\scaledpoint]% +% {\doifelsenothing{#3}% +% {\definedfont[#2 at #4\scaledpoint]}% +% {\definedfont[#2*#3\space at #4\scaledpoint]}% % \clf_registerfontfallbackid#1\space\fontid\font\space{#2}} -% \def\font_fallbacks_finish_math -% {\ctxlua{mathematics.finishfallbacks()}} +% % % \def\font_fallbacks_register_math#1#2#3#4% +% % % {\definedfont[#2\iftok{#3}\emptytoks\else*#3 \fi at #4\scaledpoint]% +% % % \clf_registerfontfallbackid#1\space\fontid\font\space{#2}} +% % % +% % % \def\font_fallbacks_finish_math +% % % {\ctxlua{mathematics.finishfallbacks()}} % check : only replace when present in replacement font (default: no) % force : force replacent even when basefont has glyph (default: yes) diff --git a/tex/context/base/mkxl/font-con.lmt b/tex/context/base/mkxl/font-con.lmt index 319d5fe48..2e32193e9 100644 --- a/tex/context/base/mkxl/font-con.lmt +++ b/tex/context/base/mkxl/font-con.lmt @@ -445,7 +445,7 @@ function constructors.scale(tfmdata,specification) local hasquality = parameters.expansion or parameters.protrusion local hasitalics = properties.hasitalics local autoitalicamount = properties.autoitalicamount - local stackmath = not properties.nostackmath + -- local stackmath = not properties.nostackmath local haskerns = properties.haskerns or properties.mode == "base" -- we can have afm in node mode local hasligatures = properties.hasligatures or properties.mode == "base" -- we can have afm in node mode local realdimensions = properties.realdimensions @@ -720,7 +720,8 @@ function constructors.scale(tfmdata,specification) -- if vo then -- chr.bottomovershoot = vo*hdelta -- end - if stackmath then -- not ok yet + -- + -- if stackmath then -- not ok yet local mk = character.mathkerns if mk then local tr = mk.topright @@ -734,7 +735,8 @@ function constructors.scale(tfmdata,specification) bottomleft = bl and mathkerns(bl,vdelta) or nil, } end - end + -- end + -- if hasitalics then local vi = character.italic if vi and vi ~= 0 then diff --git a/tex/context/base/mkxl/font-ctx.lmt b/tex/context/base/mkxl/font-ctx.lmt index 75572e089..83c0a912b 100644 --- a/tex/context/base/mkxl/font-ctx.lmt +++ b/tex/context/base/mkxl/font-ctx.lmt @@ -90,6 +90,7 @@ local setsubtype = nuts.setsubtype local texgetdimen = tex.getdimen local texsetcount = tex.setcount +local texiscount = tex.iscount local texget = tex.get local texdefinefont = tex.definefont @@ -1119,12 +1120,16 @@ local specifiers = { } do -- else too many locals - local starttiming = statistics.starttiming - local stoptiming = statistics.stoptiming + local starttiming = statistics.starttiming + local stoptiming = statistics.stoptiming - local setmacro = tokens.setters.macro - local ctxcatcodes = tex.ctxcatcodes - local texconditionals = tex.conditionals + local setmacro = tokens.setters.macro + local ctxcatcodes = tex.ctxcatcodes + local texconditionals = tex.conditionals + + local c_scaledfontmode = texiscount("scaledfontmode") + local c_scaledfontsize = texiscount("scaledfontsize") + local c_lastfontid = texiscount("lastfontid") local reported = setmetatableindex(function(t,k) local v = setmetatableindex(function(t,k) @@ -1166,7 +1171,7 @@ do -- else too many locals local mode, fontsize, sx, sy = lpegmatch(sizepattern,size) -- print(size,mode,fontsize,sx,sy) if mode and fontsize and fontsize ~= "" then - texsetcount("scaledfontmode",mode) + texsetcount(c_scaledfontmode,mode) -- ctx_setsomefontsize(fontsize) -- We use a catcodetable, just in case it's 1.2\exheight (a corner case that showed -- up in the lmtx manual: marking that changed size in the mids of some verbatim). @@ -1178,15 +1183,15 @@ do -- else too many locals setmacro("somefontsizey",sy) end else - texsetcount("scaledfontmode",0) + texsetcount(c_scaledfontmode,0) -- ctx_setemptyfontsize() end elseif true then -- so we don't need to check in tex - texsetcount("scaledfontmode",2) + texsetcount(c_scaledfontmode,2) -- ctx_setemptyfontsize() else - texsetcount("scaledfontmode",0) + texsetcount(c_scaledfontmode,0) -- ctx_setemptyfontsize() end specification = definers.makespecification(str,lookup,name,sub,method,detail,size) @@ -1374,99 +1379,36 @@ do -- else too many locals local properties = tfmdata.properties -- we use char0 as signal; cf the spec pdf can handle this (no char in slot) characters[0] = nil - -- characters[0x00A0] = { width = parameters.space } - -- characters[0x2007] = { width = characters[0x0030] and characters[0x0030].width or parameters.space } -- figure - -- characters[0x2008] = { width = characters[0x002E] and characters[0x002E].width or parameters.space } -- period - -- - local fallbacks = specification.fallbacks or "" - local mathsize = (mathsize == 1 or mathsize == 2 or mathsize == 3) and mathsize or nil -- can be unset so we test 1 2 3 - if fallbacks ~= "" and mathsize and not busy then - busy = true - -- We need this ugly hack in order to resolve fontnames (at the \TEX end). Originally - -- math was done in Lua after loading (plugged into aftercopying). - -- - -- After tl 2017 I'll also do text fallbacks this way (although backups there are done - -- in a completely different way.) - if trace_defining then - report_defining("defining %a, id %a, target %a, features %a / %a, fallbacks %a / %a, step %a", - name,id,nice_cs(cs),classfeatures,fontfeatures,classfallbacks,fontfallbacks,1) - end - mathematics.resolvefallbacks(tfmdata,specification,fallbacks) - context(function() - -- We're doing math fallbacks. - busy = false - mathematics.finishfallbacks(tfmdata,specification,fallbacks) - tfmdata.original = specification.specification - constructors.beforepassingfonttotex(tfmdata) - local id = definefont(tfmdata,properties.id) - csnames[id] = specification.cs - properties.id = id -- already set - definers.register(tfmdata,id) -- to be sure, normally already done - texdefinefont(global,cs,id) - -- texdefinefont(cs,id,global and "global") - constructors.finalize(tfmdata) - if trace_defining then - report_defining("defining %a, id %a, target %a, features %a / %a, fallbacks %a / %a, step %a", - name,id,nice_cs(cs),classfeatures,fontfeatures,classfallbacks,fontfallbacks,2) - end - -- resolved (when designsize is used): - local size = round(tfmdata.parameters.size or 655360) - setmacro("somefontsize",size.."sp") - -- ctx_setsomefontsize(size .. "sp") - texsetcount("scaledfontsize",size) - lastfontid = id - -- - if trace_defining then - report_defining("memory usage after: %s",statistics.memused()) - report_defining("stop stage two") - end - -- - texsetcount("global","lastfontid",lastfontid) - specifiers[lastfontid] = { str, size } - if not mathsize then - -- forget about it (can't happen here) - elseif mathsize == 0 then - -- can't happen (here) - else - -- maybe only 1 2 3 (we already test for this) - lastmathids[mathsize] = lastfontid - end - stoptiming(fonts) - end) - return - else - tfmdata.original = specification.specification - local id = definefont(tfmdata,properties.id) - csnames[id] = specification.cs - properties.id = id -- already set - definers.register(tfmdata,id) -- to be sure, normally already done - texdefinefont(global,cs,id) - -- texdefinefont(cs,id,global and "global") - constructors.finalize(tfmdata) - if trace_defining then - report_defining("defining %a, id %a, target %a, features %a / %a, fallbacks %a / %a, step %a", - name,id,nice_cs(cs),classfeatures,fontfeatures,classfallbacks,fontfallbacks,"-") - end - -- resolved (when designsize is used): - local size = round(tfmdata.parameters.size or 655360) - setmacro("somefontsize",size.."sp") - -- ctx_setsomefontsize(size .. "sp") - texsetcount("scaledfontsize",size) - lastfontid = id + tfmdata.original = specification.specification + local id = definefont(tfmdata,properties.id) + csnames[id] = specification.cs + properties.id = id -- already set + definers.register(tfmdata,id) -- to be sure, normally already done + texdefinefont(global,cs,id) + -- texdefinefont(cs,id,global and "global") + constructors.finalize(tfmdata) + if trace_defining then + report_defining("defining %a, id %a, target %a, features %a / %a, fallbacks %a / %a, step %a", + name,id,nice_cs(cs),classfeatures,fontfeatures,classfallbacks,fontfallbacks,"-") end + -- resolved (when designsize is used): + local size = round(tfmdata.parameters.size or 655360) + setmacro("somefontsize",size.."sp") + texsetcount(c_scaledfontsize,size) + lastfontid = id elseif tfmtype == "number" then if trace_defining then report_defining("reusing %s, id %a, target %a, features %a / %a, fallbacks %a / %a, goodies %a / %a, designsize %a / %a", name,tfmdata,nice_cs(cs),classfeatures,fontfeatures,classfallbacks,fontfallbacks,classgoodies,goodies,classdesignsize,fontdesignsize) end csnames[tfmdata] = specification.cs +-- \definedfont ends up here texdefinefont(global,cs,tfmdata) -- texdefinefont(cs,tfmdata,global and "global") -- resolved (when designsize is used): local size = round(fontdata[tfmdata].parameters.size or 0) - -- ctx_setsomefontsize(size .. "sp") setmacro("somefontsize",size.."sp") - texsetcount("scaledfontsize",size) + texsetcount(c_scaledfontsize,size) lastfontid = tfmdata else local nice = nice_cs(cs) @@ -1474,7 +1416,7 @@ do -- else too many locals report_defining("unable to define %a as %a",name,nice) end lastfontid = -1 - texsetcount("scaledfontsize",0) + texsetcount(c_scaledfontsize,0) -- ctx_letvaluerelax(cs) -- otherwise the current definition takes the previous one end if trace_defining then @@ -1482,7 +1424,7 @@ do -- else too many locals report_defining("stop stage two") end -- - texsetcount("global","lastfontid",lastfontid) + texsetcount("global",c_lastfontid,lastfontid) specifiers[lastfontid] = { str, size } if not mathsize then -- forget about it @@ -1606,6 +1548,8 @@ do -- else too many locals local n = 0 + local d_bodyfontsize = tex.isdimen("bodyfontsize") + function definers.internal(specification,cs) specification = specification or { } local name = specification.name @@ -1613,7 +1557,7 @@ do -- else too many locals local number = tonumber(specification.number) local id = nil if not size then - size = texgetdimen("bodyfontsize") + size = texgetdimen(d_bodyfontsize) end if number then id = number @@ -1670,6 +1614,8 @@ end -- have delayed definitions and so we never know what style is taken -- as start. +local c_font_scaled_points = texiscount("c_font_scaled_points") + function constructors.calculatescale(tfmdata,scaledpoints,relativeid,specification) local parameters = tfmdata.parameters local units = parameters.units or 1000 @@ -1691,7 +1637,7 @@ function constructors.calculatescale(tfmdata,scaledpoints,relativeid,specificati -- a temp hack till we have upgraded all mechanisms local delta = round(scaledpoints/units) local size = round(scaledpoints) - texsetcount("c_font_scaled_points",size) + texsetcount(c_font_scaled_points,size) -- return size, delta end diff --git a/tex/context/base/mkxl/font-imp-math.lmt b/tex/context/base/mkxl/font-imp-math.lmt index 04fe5c04c..bd445caea 100644 --- a/tex/context/base/mkxl/font-imp-math.lmt +++ b/tex/context/base/mkxl/font-imp-math.lmt @@ -20,56 +20,55 @@ local texconditionals = tex.conditionals -- tfmdata.properties.mathnolimitsmode = tonumber(value) or 0 -local splitter = lpeg.splitat(",",tonumber) -local lpegmatch = lpeg.match - -local function initialize(tfmdata,value) - local mathparameters = tfmdata.mathparameters - if mathparameters then - local sup, sub - if type(value) == "string" then - sup, sub = lpegmatch(splitter,value) -- settings_to_array - if not sup then - sub, sup = 0, 0 - elseif not sub then - sub, sup = sup, 0 - end - elseif type(value) == "number" then - sup, sub = 0, value - end - if sup then - mathparameters.NoLimitSupFactor = sup - end - if sub then - mathparameters.NoLimitSubFactor = sub - end - end -end - -registerotffeature { - name = "mathnolimitsmode", - description = "influence nolimits placement", - initializers = { - base = initialize, - node = initialize, - } -} - - --- this will become a mode in the engine - -local function initialize(tfmdata,value) - tfmdata.properties.nostackmath = value and true -end +-- local splitter = lpeg.splitat(",",tonumber) +-- local lpegmatch = lpeg.match +-- +-- local function initialize(tfmdata,value) +-- local mathparameters = tfmdata.mathparameters +-- if mathparameters then +-- local sup, sub +-- if type(value) == "string" then +-- sup, sub = lpegmatch(splitter,value) -- settings_to_array +-- if not sup then +-- sub, sup = 0, 0 +-- elseif not sub then +-- sub, sup = sup, 0 +-- end +-- elseif type(value) == "number" then +-- sup, sub = 0, value +-- end +-- if sup then +-- mathparameters.NoLimitSupFactor = sup +-- end +-- if sub then +-- mathparameters.NoLimitSubFactor = sub +-- end +-- end +-- end +-- +-- registerotffeature { +-- name = "mathnolimitsmode", +-- description = "influence nolimits placement", +-- initializers = { +-- base = initialize, +-- node = initialize, +-- } +-- } -registerotffeature { - name = "nostackmath", - description = "disable math stacking mechanism", - initializers = { - base = initialize, - node = initialize, - } -} +-- this will become a mode in the engine -- done +-- +-- local function initialize(tfmdata,value) +-- tfmdata.properties.nostackmath = value and true +-- end +-- +-- registerotffeature { +-- name = "nostackmath", +-- description = "disable math stacking mechanism", +-- initializers = { +-- base = initialize, +-- node = initialize, +-- } +-- } -- A quick and dirty and low level implementation but okay for testing: diff --git a/tex/context/base/mkxl/font-ini.mklx b/tex/context/base/mkxl/font-ini.mklx index 67663b7db..1fab52386 100644 --- a/tex/context/base/mkxl/font-ini.mklx +++ b/tex/context/base/mkxl/font-ini.mklx @@ -667,9 +667,10 @@ \mutable\let\somefontsizex\empty \mutable\let\somefontsizey\empty -\newcount\scaledfontmode % also used at the lua end -\newcount\scaledfontsize % also used at the lua end -\newcount\lastfontid % also used at the lua end / tex end +% \newcount\scaledfontmode % font-lib.mklx +% \newcount\scaledfontsize % font-lib.mklx +% \newcount\lastfontid % font-lib.mklx + \newtoks \everydefinefont \aliased\let\c_font_feature_inheritance_fontnone \zerocount % none @@ -692,13 +693,11 @@ \immutable\dimensiondef\d_font_scaled_default 10pt -\newcount\c_font_future_glyph_scale - % todo: move all to lua: use localcall for resolving filename -\newcount\c_font_future_glyph_scale -\newcount\c_font_scaled_font_mode_saved -\newcount\c_font_scaled_points +% \newcount\c_font_future_glyph_scale % font-lib.mklx +% \newcount\c_font_scaled_font_mode_saved % font-lib.mklx +% \newcount\c_font_scaled_points % font-lib.mklx \mutable\let\somefontspec \empty \mutable\let\lastrawfontcall \relax @@ -1218,7 +1217,7 @@ \ifcsname\??fontenvironments \s!default\s!text \endcsname\lastnamedcs\else \csname\??fontenvironments \s!default \endcsname \fi} -\setvalue{\??fontenvironments\s!default}{1} +\defcsname\??fontenvironments\s!default\endcsname{1} %D In the following macros we use \type {\currentxfontsize} to hold the current %D x||size of the font. This enables us to support for instance \type {\sl} inside a @@ -1313,10 +1312,10 @@ % todo: class:size % todo: make assignments global -\letvalue\??fontenvironments\empty % so we default to empty +\letcsname\??fontenvironments\endcsname\empty % so we default to empty \permanent\def\bodyfontvariable#parameter% - {\csname\??fontenvironments + {\begincsname\??fontenvironments \ifcsname\??fontenvironments\fontclass\normalizedbodyfontsize#parameter\endcsname\fontclass\normalizedbodyfontsize#parameter\orelse \ifcsname\??fontenvironments\fontclass #parameter\endcsname\fontclass #parameter\orelse \ifcsname\??fontenvironments \normalizedbodyfontsize#parameter\endcsname \normalizedbodyfontsize#parameter\orelse @@ -1329,13 +1328,20 @@ \ifcsname\??fontenvironments \normalizedbodyfontsize#parameter\endcsname\lastnamedcs\orelse \ifcsname\??fontenvironments\s!default #parameter\endcsname\lastnamedcs\fi} -\permanent\def\bodyfontsizevariable#size#parameter% - {\csname\??fontenvironments - \ifcsname\??fontenvironments\fontclass#size#parameter\endcsname\fontclass#size#parameter\orelse - \ifcsname\??fontenvironments\fontclass #parameter\endcsname\fontclass #parameter\orelse - \ifcsname\??fontenvironments #size#parameter\endcsname #size#parameter\orelse - \ifcsname\??fontenvironments\s!default #parameter\endcsname\s!default #parameter\fi - \endcsname} +% \permanent\def\bodyfontsizevariable#size#parameter% +% {\begincsname\??fontenvironments +% \ifcsname\??fontenvironments\fontclass#size#parameter\endcsname\fontclass#size#parameter\orelse +% \ifcsname\??fontenvironments\fontclass #parameter\endcsname\fontclass #parameter\orelse +% \ifcsname\??fontenvironments #size#parameter\endcsname #size#parameter\orelse +% \ifcsname\??fontenvironments\s!default #parameter\endcsname\s!default #parameter\fi +% \endcsname} + +\def\font_bodyfontvariable#parameter% + {\ifcsname\??fontenvironments\fontclass\normalizedbodyfontsize#parameter\endcsname\lastnamedcs\orelse + \ifcsname\??fontenvironments\fontclass #parameter\endcsname\lastnamedcs\orelse + \ifcsname\??fontenvironments\v!all \normalizedbodyfontsize#parameter\endcsname\lastnamedcs\orelse + \ifcsname\??fontenvironments \normalizedbodyfontsize#parameter\endcsname\lastnamedcs\orelse + \ifcsname\??fontenvironments\s!default #parameter\endcsname\lastnamedcs\fi} \def\font_bodyfontsizevariable#size#parameter% {\ifcsname\??fontenvironments\fontclass#size#parameter\endcsname\lastnamedcs\orelse @@ -2387,6 +2393,28 @@ }% \gletcsname\??fontbodyfaces\fontbody\endcsname\font_basics_set_faces} +% \permanent\def\currentbodyfontdimension#parameter% there can be factors here +% {\the\dimexpr +% \ifcsname\??fontenvironments\fontclass\normalizedbodyfontsize#parameter\endcsname +% \lastnamedcs +% \orelse\ifcsname\??fontenvironments\fontclass\s!default#parameter\endcsname +% \lastnamedcs +% \dimexpr\normalizedbodyfontsize\relax +% \orelse\ifcsname\??fontenvironments\normalizedbodyfontsize#parameter\endcsname +% \lastnamedcs +% \else +% \csname\??fontenvironments\s!default#parameter\endcsname +% \dimexpr\normalizedbodyfontsize\relax +% \fi +% \relax} + +% \setupbodyfontenvironment [all] [12pt] [x=4pt,small=4pt] +% \setupbodyfontenvironment [pagella] [12pt] [x=4pt,small=4pt] +% +% \setupbodyfont[pagella,12pt] +% +% \starttext normal {\tx tx} {\small small} \stoptext + \permanent\def\currentbodyfontdimension#parameter% there can be factors here {\the\dimexpr \ifcsname\??fontenvironments\fontclass\normalizedbodyfontsize#parameter\endcsname @@ -2394,6 +2422,8 @@ \orelse\ifcsname\??fontenvironments\fontclass\s!default#parameter\endcsname \lastnamedcs \dimexpr\normalizedbodyfontsize\relax + \orelse\ifcsname\??fontenvironments\v!all\normalizedbodyfontsize#parameter\endcsname + \lastnamedcs \orelse\ifcsname\??fontenvironments\normalizedbodyfontsize#parameter\endcsname \lastnamedcs \else diff --git a/tex/context/base/mkxl/font-lib.mklx b/tex/context/base/mkxl/font-lib.mklx index f7342c7d4..05367dae8 100644 --- a/tex/context/base/mkxl/font-lib.mklx +++ b/tex/context/base/mkxl/font-lib.mklx @@ -15,6 +15,18 @@ \unprotect +\newcount\scaledfontmode +\newcount\scaledfontsize +\newcount\lastfontid + +\newcount\c_font_future_glyph_scale +\newcount\c_font_scaled_font_mode_saved +\newcount\c_font_scaled_points + +\ifdefined\globalbodyfontsize \else \newdimen\globalbodyfontsize \fi +\ifdefined\localbodyfontsize \else \newdimen\localbodyfontsize \fi +\ifdefined\bodyfontsize \else \newdimen\bodyfontsize \fi + \registerctxluafile{font-ini}{autosuffix} \registerctxluafile{font-log}{} \registerctxluafile{font-con}{autosuffix} % kind of early diff --git a/tex/context/base/mkxl/font-pre.mkxl b/tex/context/base/mkxl/font-pre.mkxl index 8cb0b5b6c..4a7442d10 100644 --- a/tex/context/base/mkxl/font-pre.mkxl +++ b/tex/context/base/mkxl/font-pre.mkxl @@ -412,13 +412,13 @@ [mode=base, % mode=none, % better, maybe do this last kern=yes, -% flac=yes, % handled differently -% liga=yes, % makes no sense -% mode=node, -% mathnolimitsmode={0,800}, % now in lfg files + % flac=yes, % handled differently + % liga=yes, % makes no sense + % mode=node, + % mathnolimitsmode={0,800}, % now in lfg files mathalternates=yes, - mathitalics=yes, % we pass them - mathdimensions=all, + % mathitalics=yes, % we pass them + % mathdimensions=all, % mathkerns=yes, % staircase=yes, compactmath=yes, @@ -467,10 +467,10 @@ \definefontfeature[math-scriptscript-r2l] [mathematics-r2l] [ssty=2,mathsize=yes] % this will go away: could be a mode in the engine - -\definefontfeature[math-nostack-text] [math-text] [nostackmath=yes] -\definefontfeature[math-nostack-script] [math-script] [nostackmath=yes] -\definefontfeature[math-nostack-scriptscript][math-scriptscript][nostackmath=yes] +% +% \definefontfeature[math-nostack-text] [math-text] [nostackmath=yes] +% \definefontfeature[math-nostack-script] [math-script] [nostackmath=yes] +% \definefontfeature[math-nostack-scriptscript][math-scriptscript][nostackmath=yes] % \definefontfeature[mathtext] [math-text] % \definefontfeature[mathscript] [math-script] @@ -987,11 +987,9 @@ \startsetups experiment:fonts:compact \settrue\c_font_compact - % \definefontfeature[virtualmath] [mathematics] [compactmath=yes] % \definefontfeature[virtualmath-l2r] [mathematics-l2r][compactmath=yes] % \definefontfeature[virtualmath-r2l] [mathematics-r2l][compactmath=yes] - % \definefontfeature[math-text] [mathematics] [compactmath=yes] % \definefontfeature[math-script] [mathematics] [compactmath=yes] % \definefontfeature[math-scriptscript] [mathematics] [compactmath=yes] diff --git a/tex/context/base/mkxl/lpdf-ano.lmt b/tex/context/base/mkxl/lpdf-ano.lmt index e3904f16e..ed26b512e 100644 --- a/tex/context/base/mkxl/lpdf-ano.lmt +++ b/tex/context/base/mkxl/lpdf-ano.lmt @@ -112,6 +112,10 @@ local pdf_named = pdfconstant("Named") local autoprefix = "#" local usedautoprefixes = { } +function codeinjections.setautoprefix(prefix) + autoprefix = prefix ~= "" and prefix or autoprefix +end + local function registerautoprefix(name) local internal = autoprefix .. name if usedautoprefixes[internal] == nil then diff --git a/tex/context/base/mkxl/math-act.lmt b/tex/context/base/mkxl/math-act.lmt index 7fb4f9b9f..713635583 100644 --- a/tex/context/base/mkxl/math-act.lmt +++ b/tex/context/base/mkxl/math-act.lmt @@ -13,7 +13,7 @@ local type, next, tonumber = type, next, tonumber local fastcopy, copytable, insert, remove = table.fastcopy, table.copy, table.insert, table.remove local formatters = string.formatters local byte = string.byte -local setmetatableindex, sortedhash = table.setmetatableindex, table.sortedhash +local setmetatableindex, sortedkeys, sortedhash = table.setmetatableindex, table.sortedkeys, table.sortedhash local lpegmatch = lpeg.match local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end) @@ -54,7 +54,8 @@ local fontproperties = fonts.hashes.properties local mathgaps = mathematics.gaps -local use_math_goodies = true directives.register("math.nogoodies", function(v) use_math_goodies = not v end) +local use_math_goodies = true directives.register("math.nogoodies", function(v) use_math_goodies = not v end) +local checkitalics = false trackers .register("math.checkitalics", function(v) checkitalics = v end) local mathfontparameteractions = sequencers.new { name = "mathparameters", @@ -136,40 +137,45 @@ local how = { DelimiterPercent = "unscaled", } -function mathematics.scaleparameters(target,original) - if not target.properties.math_is_scaled then - local mathparameters = target.mathparameters - if mathparameters and next(mathparameters) then - local parameters = target.parameters - local factor = parameters.factor - local hfactor = parameters.hfactor - local vfactor = parameters.vfactor - for name, value in next, mathparameters do - local h = how[name] - if h == "unscaled" then - -- kept - elseif h == "horizontal" then - value = value * hfactor - elseif h == "vertical"then - value = value * vfactor - else - value = value * factor - end - mathparameters[name] = value +local function scaleparameters(mathparameters,parameters) + if mathparameters and next(mathparameters) and parameters then + local factor = parameters.factor + local hfactor = parameters.hfactor + local vfactor = parameters.vfactor + for name, value in next, mathparameters do + local h = how[name] + if h == "unscaled" then + -- kept + elseif h == "horizontal" then + value = value * hfactor + elseif h == "vertical"then + value = value * vfactor + else + value = value * factor end + mathparameters[name] = value end + end +end + +function mathematics.scaleparameters(target,original) + if not target.properties.math_is_scaled then + scaleparameters(target.mathparameters,target.parameters) target.properties.math_is_scaled = true end end -- AccentBaseHeight vs FlattenedAccentBaseHeight -function mathematics.checkaccentbaseheight(target,original) - local mathparameters = target.mathparameters - if mathparameters and mathparameters.AccentBaseHeight == 0 then - mathparameters.AccentBaseHeight = target.parameters.xheight -- needs checking - end -end +-- function mathematics.checkaccentbaseheight(target,original) +-- local mathparameters = target.mathparameters +-- if mathparameters and mathparameters.AccentBaseHeight == 0 then +-- if trace_defining then +-- report_math("zero AccentBaseHeight corrected %a @ %p",target.properties.fullname,target.parameters.size) +-- end +-- mathparameters.AccentBaseHeight = target.parameters.xheight -- needs checking +-- end +-- end function mathematics.overloadparameters(target,original) if use_math_goodies then @@ -183,8 +189,6 @@ function mathematics.overloadparameters(target,original) if mathematics then local parameters = mathematics.parameters local bigslots = mathematics.bigslots or mathematics.bigs --- inspect(parameters) --- print("before",mathparameters.AxisHeight) if parameters then if trace_defining then report_math("overloading math parameters in %a @ %p",target.properties.fullname,target.parameters.size) @@ -207,7 +211,6 @@ function mathematics.overloadparameters(target,original) end mathparameters[name] = newvalue end --- print("after ",mathparameters.AxisHeight) for name, value in next, parameters do local tvalue = type(value) if tvalue == "string" then @@ -250,29 +253,34 @@ local function report_tweak(fmt,target,original,...) local metadata = (original and original.shared.rawdata.metadata) or (target and target .shared.rawdata.metadata) local parameters = target.parameters - report_mathtweak( - "%a, size %P, math size %i, %s", - metadata and metadata.fontname or "unknown", - parameters.size or 655360, - parameters.mathsize or 1, - string.formatters[fmt](...) - ) + if parameters then + report_mathtweak( + "%a, size %P, math size %i, %s", + metadata and metadata.fontname or "unknown", + parameters.size or 655360, + parameters.mathsize or 1, + string.formatters[fmt](...) + ) + else + print("something is wrong") + end else report_mathtweak("") end end mathtweaks.subsets = { - acenorsuvxz = { 0x1D44E, 0x1D450, 0x1D452, 0x1D45B, 0x1D45C, 0x1D45F, 0x1D460, 0x1D462, 0x1D463, 0x1D465, 0x1D467 }, - bhklt = { 0x1D44F, 0x1D455, 0x1D458, 0x1D459, 0x1D461 }, - d = { 0x1D451 }, - f = { 0x1D453 }, - gjqy = { 0x1D454, 0x1D457, 0x1D45E, 0x1D466 }, - i = { 0x1D456 }, - mw = { 0x1D45A, 0x1D464 }, - p = { 0x1D45D }, - dotless = { 0x00049, 0x0004A, 0x00131, 0x00237, 0x1D6A4, 0x1D6A5 }, - integrals = { 0x0222B, 0x0222C, 0x0222D, 0x0222E, 0x0222F, 0x02230, 0x02231, 0x02232, 0x02233, 0x02A0B, 0x02A0C, 0x02A0D, 0x02A0E, 0x02A0F, 0x02A10, 0x02A11, 0x02A12, 0x02A13, 0x02A14, 0x02A15, 0x02A16, 0x02A17, 0x02A18, 0x02A19, 0x02A1A, 0x02A1B, 0x02A1C }, + acenorsuvxz = { 0x1D44E, 0x1D450, 0x1D452, 0x1D45B, 0x1D45C, 0x1D45F, 0x1D460, 0x1D462, 0x1D463, 0x1D465, 0x1D467 }, + bhklt = { 0x1D44F, 0x1D455, 0x1D458, 0x1D459, 0x1D461 }, + d = { 0x1D451 }, + f = { 0x1D453 }, + gjqy = { 0x1D454, 0x1D457, 0x1D45E, 0x1D466 }, + i = { 0x1D456 }, + mw = { 0x1D45A, 0x1D464 }, + p = { 0x1D45D }, + dotless = { 0x00049, 0x0004A, 0x00131, 0x00237, 0x1D6A4, 0x1D6A5 }, + integrals = { 0x0222B, 0x0222C, 0x0222D, 0x0222E, 0x0222F, 0x02230, 0x02231, 0x02232, 0x02233, 0x02A0B, 0x02A0C, 0x02A0D, 0x02A0E, 0x02A0F, 0x02A10, 0x02A11, 0x02A12, 0x02A13, 0x02A14, 0x02A15, 0x02A16, 0x02A17, 0x02A18, 0x02A19, 0x02A1A, 0x02A1B, 0x02A1C, 0x02320, 0x02321 }, + horizontalfences = { 0x023B4, 0x023B5, 0x023DC, 0x023DD, 0x023DE, 0x023DF, 0x023E0, 0x023E1 }, -- not really used } local function getalso(target,original) @@ -519,7 +527,7 @@ do else report_mathtweak("invalid dimension entry %U",k) end --- character.tweaked = true +-- character.tweaked = true if v.all then local nxt = character.next if nxt then @@ -594,10 +602,6 @@ do report_mathtweak(parameters.text or "no message") end -end - -do - function mathtweaks.showinfo(target,original,parameters) local mathparameters = target.mathparameters for k, v in sortedhash(mathparameters) do @@ -650,7 +654,7 @@ do end end if trace_tweaking and count > 0 then - report_mathtweak("%i variants wiped",count) + report_tweak("%i variants wiped",target,original,count) end end end @@ -677,7 +681,7 @@ do end end if trace_tweaking and count > 0 then - report_mathtweak("%i permanent replacements",count) + report_tweak("%i permanent replacements",target,original,count) end end end @@ -698,7 +702,7 @@ do end end if trace_tweaking and count > 0 then - report_mathtweak("%i permanent substitutions",count) + report_tweak("%i permanent substitutions",target,original,count) end end end @@ -741,7 +745,6 @@ do end for k, v in next, list do -- no need for sortedhash(list) unless we report --- for k, v in sortedhash(list) do -- no need for sortedhash(list) unless we report stepper(k,function(n) -- todo: also make stepper accept a table add(v,n) end) @@ -766,23 +769,13 @@ do -- end if trace_tweaking and count > 0 then - report_mathtweak("%i kern pairs",count) + report_tweak("%i kern pairs",target,original,count) end end end end -do - - function mathtweaks.variants(target,original,parameters) - report_mathtweak("todo: remove 'variants' tweak from goodie file") - end - - mathtweaks.variant = mathtweaks.variants - -end - do -- see changed hack in math-fbk @@ -956,35 +949,35 @@ do unicode = 0x002D, -- hyphen minus }, ["unary plus"] = { - original = 0x002B, - extend = .5, - squeeze = .5, - width = .5, - height = .5, - yoffset = .2, - mode = 2, - wline = .5, - unicode = 0x002B, + original = 0x002B, + extend = .5, + squeeze = .5, + width = .5, + height = .5, + yoffset = .2, + mode = 2, + wline = .5, + unicode = 0x002B, }, ["unary plus minus"] = { - original = 0x00B1, - extend = .5, - squeeze = .5, - width = .5, - height = .5, - yoffset = .2, - mode = 2, - wline = .5, + original = 0x00B1, + extend = .5, + squeeze = .5, + width = .5, + height = .5, + yoffset = .2, + mode = 2, + wline = .5, }, ["unary minus plus"] = { - original = 0x2213, - extend = .5, - squeeze = .5, - width = .5, - height = .5, - yoffset = .2, - mode = 2, - wline = .5, + original = 0x2213, + extend = .5, + squeeze = .5, + width = .5, + height = .5, + yoffset = .2, + mode = 2, + wline = .5, }, } @@ -1015,7 +1008,7 @@ do v = table.combine(p,v) p.preset = nil else - goto NEXT + goto next end end local charslot = v.original @@ -1033,7 +1026,7 @@ do end processedprivates[name] = v end - ::NEXT:: + ::next:: end end mathtweaks.dimensions(target,original,{ @@ -1051,12 +1044,17 @@ do local targetcharacters= target.characters local factor = tonumber(parameters.factor) or 0 if factor ~= 0 then + local count = 0 for k, v in next, targetcharacters do local a = v.topanchor if a and a > 0 then v.topanchor = a * factor + count = count + 1 end end + if trace_tweaking and count > 0 then + report_tweak("%i top anchors fixed",target,original,count) + end end end @@ -1069,20 +1067,26 @@ do -- actually this should be a an engine feature driven by category because we don't -- want this in display mode .. only a test for MS and HH - local issymbol = characters.is_symbol +-- local issymbol = characters.is_symbol +-- +-- function mathtweaks.oldstylemath(target,original,parameters) +-- local chardata = characters.data +-- local characters = target.characters +-- local axis = target.mathparameters.AxisHeight +-- local delta = (parameters.factor or .1) * axis +-- target.mathparameters.AxisHeight = (axis - delta) +-- for k, v in sortedhash(characters) do +-- if issymbol[k] then -- quick hack, engine knows +-- print("old style math",k,chardata[k].description) +-- v.yoffset = -delta +-- v.height = (v.height or 0) - delta +-- v.depth = (v.depth or 0) - delta +-- end +-- end +-- end function mathtweaks.oldstylemath(target,original,parameters) - local characters = target.characters - local axis = target.mathparameters.AxisHeight - local delta = (parameters.factor or .1) * axis - target.mathparameters.AxisHeight = (axis - delta) - for k, v in sortedhash(characters) do - if issymbol[k] then -- quick hack, engine knows - v.yoffset = -delta - v.height = (v.height or 0) - delta - v.depth = (v.depth or 0) - delta - end - end + -- not relevant end end @@ -1170,7 +1174,7 @@ do else local done = false local italic = c.italic - if move then + if move and not c.advance then -- advance check prevents double move local width = c.width or 0 c.advance = width if correct then @@ -1183,23 +1187,14 @@ do if topanchor then c.topanchor = topanchor + llx end --- if c.bottomleft or c.topleft then --- print("BEFORE",c.bottomleft,c.topleft,llx) --- c.bottomleft = (c.bottomleft or 0) - llx --- c.topleft = (c.topleft or 0) - llx --- print("AFTER",c.bottomleft,c.topleft,llx) --- else - c.bottomleft = (c.bottomleft or 0) - llx - c.topleft = (c.topleft or 0) - llx --- end + c.bottomleft = (c.bottomleft or 0) - llx + c.topleft = (c.topleft or 0) - llx done = true end end if italic and italic ~= 0 then c.width = width + italic --- print(">>>",bottomright) c.bottomright = - italic --- c.bottomright = c.bottomright - italic done = true else c.width = width @@ -1223,18 +1218,36 @@ do goto smaller ::smaller:: s = c.smaller + ::variants:: + -- no italics here anyway butr we could check them some day else break end end end local list = parameters.list -- todo: ranges - if type(list) == "string" then + if list == "letters" or parameters.letters then + local chardata = characters.data + for k, v in sortedhash(targetcharacters) do + if v.italic then + local d = chardata[v.unicode] + local c = d and d.category + if c == "ll" or c == "lu" then + step(k) + end + end + end + return + elseif not list or list == "all" or list == true or parameters.all then + list = sortedkeys(targetcharacters) + elseif type(list) == "string" then list = { list } end for i=1,#list do local l = list[i] - if type(l) == "table" then + if not l then + -- can be false + elseif type(l) == "table" then for i=1,#l do step(i,l[i]) end @@ -1258,7 +1271,9 @@ do mathtweaks.wipeaccents = mathtweaks.wipeanchors function mathtweaks.wipeitalics(target,original,parameters) - wipe(target,original,parameters,"italic") + if not checkitalics then + wipe(target,original,parameters,"italic") + end end function mathtweaks.moveitalics(target,original,parameters) @@ -1295,7 +1310,7 @@ do mathtweaks.topaccents = mathtweaks.topanchors - function mathtweaks.limits(target,original,parameters) + function mathtweaks.movelimits(target,original,parameters) local characters = target.characters local list = parameters.list if list then @@ -1310,16 +1325,18 @@ do local c = characters[u] if c then local italic = c.italic - if italic and italic ~= 0 then - local width = c.width or 0 - local half = (italic/2) * factor - c.topanchor = width + half - c.bottomanchor = width - half - c.bottomright = - italic - c.italic = nil - if trace_tweaking then - -- todo + if italic then + if italic ~= 0 then + local width = c.width or 0 + local half = (italic/2) * factor + c.topanchor = width + half + c.bottomanchor = width - half + c.bottomright = - italic + if trace_tweaking then + -- todo + end end + c.italic = nil end local s = c.smaller if s then @@ -1348,6 +1365,9 @@ do relocate(k,tonumber(v) or factor) end end + if not next(done) then + report_tweak("no need to move limits",target,original) + end end end @@ -2028,11 +2048,11 @@ do end data.height = depth data.depth = height -if data.rorrim then - -- the original does the magic -else - data.yoffset = depth - height -end + if data.rorrim then + -- the original does the magic + else + data.yoffset = depth - height + end end local smaller = data.smaller if smaller then @@ -2315,10 +2335,8 @@ do local parameters = target.parameters local linewidth = target.MathConstants.RadicalRuleThickness -- make option local basechar = characters[radical] - local baseheight = basechar.height -/2 - local basedepth = basechar.depth -/2 + local baseheight = basechar.height/2 + local basedepth = basechar.depth/2 local basetotal = baseheight + basedepth local used = baseheight -- @@ -2846,19 +2864,41 @@ end do - function mathtweaks.diagnose(target,original,parameters) - local characters = target.characters - for k, v in sortedhash(characters) do - local italic = v.italic - if italic then - report_tweak("italics: %U %p",target,original,k,italic) + function mathtweaks.parameters(target,original,parameters) + local newparameters = parameters.list + local oldparameters = target.mathparameters + if newparameters and oldparameters then + newparameters = copytable(newparameters) + scaleparameters(newparameters,target.parameters) + for name, newvalue in next, newparameters do + oldparameters[name] = newvalue end end --- inspect(characters[0xF0929]) + end + + function mathtweaks.bigslots(target,original,parameters) + local list = parameters.list + if list then + target.bigslots = list + end end end +-- do +-- +-- function mathtweaks.diagnose(target,original,parameters) +-- local characters = target.characters +-- for k, v in sortedhash(characters) do +-- local italic = v.italic +-- if italic then +-- report_tweak("italics: %C %p",target,original,k,italic) +-- end +-- end +-- end +-- +-- end + do function mathtweaks.setoptions(target,original,parameters) @@ -2944,105 +2984,110 @@ do end) function mathtweaks.replacealphabets(target,original,parameters) - local feature = parameters.feature - local features = target.specification.features.normal - if not feature or features[feature] == true then - local list = parameters.list - if list then - local definedfont = fonts.definers.internal - local copiedglyph = fonts.handlers.vf.math.copy_glyph + local list = parameters.list + if list then + local features = target.specification.features.normal + local definedfont = fonts.definers.internal + local copiedglyph = fonts.handlers.vf.math.copy_glyph -- does a deep copy, including parts and so - local getsubstitution = fonts.handlers.otf.getsubstitution - local fontdata = fonts.hashes.identifiers - -- - local fonts = target.fonts - local size = target.size - local characters = target.characters - -- compact: size = 655360 - if not fonts then - fonts = { } - target.fonts = fonts - end - if #fonts == 0 then - fonts[1] = { id = 0, size = size } -- self, will be resolved later - end - for i=1,#list do - local entry = list[i] - local filename = entry.filename - local feature = entry.feature - local thesource = entry.source - local thetarget = entry.target or thesource - if thesource and thetarget then - local sourcerange = type(thesource) == "table" and thesource or blocks[thesource] -- .gaps - local targetrange = type(thetarget) == "table" and thetarget or blocks[thetarget] -- .gaps - if sourcerange and targetrange then - local firsttarget = targetrange.first - local firstsource = sourcerange.first - local lastsource = sourcerange.last or firstsource - if firstsource and firsttarget then - local offset = firsttarget - firstsource - local topovershoot = entry.topovershoot - if filename then - local rscale = entry.rscale or 1 -- todo - size = size * rscale -- maybe use scale in vf command - -- load font, todo: set language and script, the effect hack is ugly - local fullname = filename - local effect = features.effect - if effect then - fullname = fullname .. "*" .. effects["effect={"..effect.."}"] - end - local id = definedfont { - name = fullname, - size = size, - } - local chars = fontchars[id] - local dropin = fontdata[id] - local index = #fonts + 1 - fonts[index] = { id = id, size = size } - -- copy characters - for s=firstsource,lastsource do - local t = s + offset - local sourceunicode = mathgaps[s] or s + local getsubstitution = fonts.handlers.otf.getsubstitution + local fontdata = fonts.hashes.identifiers + -- + local fonts = target.fonts + local size = target.size + local characters = target.characters +-- local descriptions = target.descriptions + -- compact: size = 655360 + if not fonts then + fonts = { } + target.fonts = fonts + end + if #fonts == 0 then + fonts[1] = { id = 0, size = size } -- self, will be resolved later + end + for i=1,#list do + local entry = list[i] + local filename = entry.filename or parameters.filename + local feature = entry.feature + local thesource = entry.source + local thetarget = entry.target or thesource + if thesource and thetarget then + local sourcerange = type(thesource) == "table" and thesource or blocks[thesource] -- .gaps + local targetrange = type(thetarget) == "table" and thetarget or blocks[thetarget] -- .gaps + if sourcerange and targetrange then + local firsttarget = targetrange.first + local firstsource = sourcerange.first + local lastsource = sourcerange.last or firstsource + if firstsource and firsttarget then + local offset = firsttarget - firstsource + local topovershoot = entry.topovershoot + if filename then + local rscale = entry.rscale or 1 -- todo + size = size * rscale -- maybe use scale in vf command + -- load font, todo: set language and script, the effect hack is ugly + local fullname = filename + local effect = features.effect + if effect then + fullname = fullname .. "*" .. effects["effect={"..effect.."}"] + end + local id = definedfont { + name = fullname, + size = size, + } + local chars = fontchars[id] + local dropin = fontdata[id] + local index = #fonts + 1 + fonts[index] = { id = id, size = size } + -- copy characters + for s=firstsource,lastsource do + local t = s + offset + local sourceunicode = mathgaps[s] or s + if chars[sourceunicode] then local targetunicode = mathgaps[t] or t if feature then sourceunicode = getsubstitution(dropin,sourceunicode,feature,true,"math","dflt") or sourceunicode end if trace_tweaking then - report_mathtweak("copying %s %U from file %a to %s %U",thesource,sourceunicode,filename,thetarget,targetunicode) + report_tweak("copying %s %U from file %a to %s %U",target,original,thesource,sourceunicode,filename,thetarget,targetunicode) end characters[targetunicode] = copiedglyph(target,characters,chars,sourceunicode,index) +-- description end - elseif feature then - for s=firstsource,lastsource do - local t = s + offset - local sourceunicode = mathgaps[s] or s - local targetunicode = mathgaps[t] or t - local variant = getsubstitution(original,sourceunicode,feature,true,"math","dflt") - local data = characters[variant] - if data then - if trace_tweaking then - report_mathtweak("copying %s %U from feature %a to %s %U",thesource,sourceunicode,feature,thetarget,targetunicode) - end - characters[targetunicode] = copytable(data) + end + elseif feature then + for s=firstsource,lastsource do + local t = s + offset + local sourceunicode = mathgaps[s] or s + local targetunicode = mathgaps[t] or t + local variant = getsubstitution(original,sourceunicode,feature,true,"math","dflt") + local data = characters[variant] + if data then + if trace_tweaking then + report_tweak("copying %s %U from feature %a to %s %U",target,original,thesource,sourceunicode,feature,thetarget,targetunicode) end + characters[targetunicode] = copytable(data) +-- description end - else - for s=firstsource,lastsource do - local t = s + offset - local sourceunicode = mathgaps[s] or s - local targetunicode = mathgaps[t] or t + end + else + for s=firstsource,lastsource do + local t = s + offset + local sourceunicode = mathgaps[s] or s + local targetunicode = mathgaps[t] or t + if sourceunicode ~= targetunicode then local data = characters[sourceunicode] if data then if trace_tweaking then - report_mathtweak("copying %s %U to %s %U",thesource,sourceunicode,thetarget,targetunicode) + report_tweak("copying %s %U to %s %U",target,original,thesource,sourceunicode,thetarget,targetunicode) end characters[targetunicode] = copytable(data) +-- description end end end - else - -- error end + else + -- error end end end @@ -3050,13 +3095,38 @@ do end end -end + function mathtweaks.fallbacks(target,original,parameters) + local fallbacks = target.specification.fallbacks + if fallbacks then + local definitions = fonts.collections.definitions[fallbacks] + if definitions then + local list = { } + for i=1,#definitions do + local definition = definitions[i] + -- local check = definition.check + -- local force = definition.force + local first = definition.start + local last = definition.stop + local offset = definition.offset or first + list[#list+1] = { + filename = definition.font, + rscale = definition.rscale or 1, + source = { first = first, last = last }, + target = { first = offset, last = offset + (last - first) }, + } + end + mathtweaks.replacealphabets(target,original,{ + tweak = "replacealphabets", + list = list, + } ) + end + end + end -local apply_tweaks = true +end -directives.register("math.applytweaks", function(v) - apply_tweaks = v; -end) +local apply_tweaks = true directives.register("math.applytweaks", function(v) apply_tweaks = v end) +local applied_tweaks = 0 local function applytweaks(when,target,original) if apply_tweaks then @@ -3073,6 +3143,8 @@ local function applytweaks(when,target,original) local mathematics = goodie.mathematics local tweaks = mathematics and mathematics.tweaks if type(tweaks) == "table" then + statistics.starttiming(mathtweaks) + applied_tweaks = applied_tweaks + 1 tweaks = tweaks[when] if type(tweaks) == "table" then if trace_defining then @@ -3084,19 +3156,24 @@ local function applytweaks(when,target,original) if type(tweak) == "table" then local action = mathtweaks[tweak.tweak or ""] if action then - local version = tweak.version - if version and version ~= target.tweakversion then - report_math("skipping tweak %a version %a",tweak.tweak,version) - elseif original then - action(target,original,tweak) - else - action(target,tweak) + local feature = tweak.feature + local features = target.specification.features.normal + if not feature or features[feature] == true then + local version = tweak.version + if version and version ~= target.tweakversion then + report_math("skipping tweak %a version %a",tweak.tweak,version) + elseif original then + action(target,original,tweak) + else + action(target,tweak) + end end end end end end end + statistics.stoptiming(mathtweaks) end tweaked[when] = true target.tweaked = tweaked @@ -3125,6 +3202,12 @@ function mathematics.tweakaftercopyingfont(target,original) end end +statistics.register("math tweaking time",function() + if applied_tweaks > 0 then + return string.format("%s seconds, %s math goodie tables", statistics.elapsedtime(mathtweaks),applied_tweaks) + end +end) + do local defaults = { @@ -3146,9 +3229,12 @@ do }, } + local reported = table.setmetatableindex("table") + function mathematics.checkaftercopyingfont(target,original) local mathparameters = target.mathparameters -- why not hasmath if mathparameters then + local chardata = characters.data local characters = target.characters -- for i=1,#defaults do @@ -3179,6 +3265,35 @@ do local ca = mathematics.alphabets.ca.tf register(sr.ucletters,ca.ucletters) register(sr.lcletters,ca.lcletters) + -- + if checkitalics then + local italics = 0 + local metadata = original.shared.rawdata.metadata + local fontname = metadata and metadata.fontname or false + for k, v in sortedhash(characters) do + local italic = v.italic + if italic then + local unicode = v.unicode + if unicode and not reported[fontname][unicode] then -- there can be variants + local data = chardata[unicode] + local description = data.description or "" + local category = data.category or "--" + report_tweak("italics: %C %p %s %s",target,original,k,italic,category,description) + reported[fontname][unicode] = true + end + italics = italics + 1 + end + end + if italics > 0 then + report_tweak("still has %i italics",target,original,italics) + goto NEXTSTEP + end + end + + target.properties.mathitalics = false + target.properties.textitalics = false + ::NEXTSTEP:: + -- more to come end end @@ -3195,7 +3310,7 @@ end sequencers.appendaction("mathparameters","system","mathematics.overloadparameters") sequencers.appendaction("mathparameters","system","mathematics.scaleparameters") -sequencers.appendaction("mathparameters","system","mathematics.checkaccentbaseheight") -- should go in lfg instead +----------.appendaction("mathparameters","system","mathematics.checkaccentbaseheight") -- should go in lfg instead ----------.appendaction("mathparameters","system","mathematics.checkprivateparameters") -- after scaling ! sequencers.appendaction("beforecopyingcharacters","system","mathematics.tweakbeforecopyingfont") @@ -3329,111 +3444,3 @@ interfaces.implement { -- can be public with two times "integerargument" context(kind) end } - -local stack = { } - -function mathematics.registerfallbackid(n,id,name) - if trace_collecting then - report_math("resolved fallback font %i, name %a, id %a, used %a", - n,name,id,fontproperties[id].fontname) - end - stack[#stack][n] = id -end - -interfaces.implement { -- will be shared with text - name = "registerfontfallbackid", - arguments = { "integer", "integer", "string" }, - actions = mathematics.registerfallbackid, -} - --- todo: run this directly .. can be done in luametatex - -function mathematics.resolvefallbacks(target,specification,fallbacks) - local definitions = fonts.collections.definitions[fallbacks] - if definitions then - local size = specification.size -- target.size - local list = { } - insert(stack,list) - context.pushcatcodes("prt") -- context.unprotect() - for i=1,#definitions do - local definition = definitions[i] - local name = definition.font - local features = definition.features or "" - local size = size * (definition.rscale or 1) - -- compact: size = 655360 - context.font_fallbacks_register_math(i,name,features,size) - if trace_collecting then - report_math("registering fallback font %i, name %a, size %a, features %a",i,name,size,features) - end - end - context.popcatcodes() - end -end - -function mathematics.finishfallbacks(target,specification,fallbacks) - local list = remove(stack) - if list and #list > 0 then - local definitions = fonts.collections.definitions[fallbacks] - if definitions and #definitions > 0 then - if trace_collecting then - report_math("adding fallback characters to font %a",specification.hash) - end - ----- definedfont = fonts.definers.internal - local copiedglyph = fonts.handlers.vf.math.copy_glyph - local fonts = target.fonts - local size = specification.size -- target.size - local characters = target.characters - -- compact: size = 655360 - if not fonts then - fonts = { } - target.fonts = fonts - end - if #fonts == 0 then - fonts[1] = { id = 0, size = size } -- self, will be resolved later - end - local done = { } - for i=1,#definitions do - local definition = definitions[i] - local name = definition.font - local start = definition.start - local stop = definition.stop - local gaps = definition.gaps - local check = definition.check - local force = definition.force - local rscale = definition.rscale or 1 - local offset = definition.offset or start - local id = list[i] - if id then - local index = #fonts + 1 - fonts[index] = { id = id, size = size } - local chars = fontchars[id] - local function remap(unic,unicode,gap) - if check and not chars[unicode] then - return - end - if force or (not done[unic] and not characters[unic]) then - if trace_collecting then - report_math("replacing math character %C by %C using vector %a and font id %a for %a%s%s", - unic,unicode,fallbacks,id,fontproperties[id].fontname,check and ", checked",gap and ", gap plugged") - end - characters[unic] = copiedglyph(target,characters,chars,unicode,index) - done[unic] = true - end - end - local step = offset - start - for unicode = start, stop do - remap(unicode + step,unicode,false) - end - if gaps then - for unic, unicode in next, gaps do - remap(unic,unicode,true) - remap(unicode,unicode,true) - end - end - end - end - elseif trace_collecting then - report_math("no fallback characters added to font %a",specification.hash) - end - end -end diff --git a/tex/context/base/mkxl/math-ini.mkxl b/tex/context/base/mkxl/math-ini.mkxl index 29af7a659..c1beb071c 100644 --- a/tex/context/base/mkxl/math-ini.mkxl +++ b/tex/context/base/mkxl/math-ini.mkxl @@ -1958,6 +1958,13 @@ %D For previous variants of the function styling you can check the git repository %D end April 2022. +% \startTEXpage[offset=1dk] +% $\sin(x) = 10$ +% \m[functionstyle=sans]{\sin(x) = 10} +% \startformula \sin(x) = 10 \stopformula +% \startformula[functionstyle=sans] \sin(x) = 10 \stopformula +% \stopTEXpage + \protected\def\math_function_handle#1#2#3% {\begingroup \letdummyparameter\c!mathlimits\empty @@ -1989,6 +1996,17 @@ \egroup \endgroup} +\appendtoks + \edef\p_functionstyle{\formulaparameter\c!functionstyle}% + \ifempty\p_functionstyle\else + \letmathematicsparameter\c!functionstyle\p_functionstyle + \fi + \edef\p_functioncolor{\formulaparameter\c!functioncolor}% + \ifempty\p_functioncolor\else + \letmathematicsparameter\c!functioncolor\p_functioncolor + \fi +\to \everybeforedisplayformula + \permanent\tolerant\protected\def\mfunction [#1]{\math_function_handle{#1}\firstofoneargument} \permanent\tolerant\protected\def\mfunctionlabeltext[#1]{\math_function_handle{#1}\mathlabeltext} @@ -3948,7 +3966,7 @@ \installcorenamespace{mathrules} -\permanent\protected\def\enablemathrules{\letgvalue{\??mathrules\fontclass}\plusone} +\permanent\protected\def\enablemathrules{\gletcsname\??mathrules\fontclass\endcsname\plusone} \appendtoks \mathrulesmode\ifcsname\??mathrules\fontclass\endcsname @@ -4378,13 +4396,13 @@ %D \stoptyping \definesystemattribute[mathaxis][public] - \def\math_axis_inject#1% {\mathatom \s!class \mathghostcode \s!unpack { \showmakeup[strut]% todo: shortcut + \scratchdimen.5\Umathfractionrule\mathstyle \srule - \s!height \dimexpr\Umathaxis\mathstyle+.2\points\relax - \s!depth -\dimexpr\Umathaxis\mathstyle-.2\points\relax + \s!height \dimexpr\Umathaxis\mathstyle+\scratchdimen\relax + \s!depth -\dimexpr\Umathaxis\mathstyle-\scratchdimen\relax \s!attr \mathaxisattribute #1% \relax}} diff --git a/tex/context/base/mkxl/math-vfu.lmt b/tex/context/base/mkxl/math-vfu.lmt index 906c9ccf6..86d1fca0d 100644 --- a/tex/context/base/mkxl/math-vfu.lmt +++ b/tex/context/base/mkxl/math-vfu.lmt @@ -651,6 +651,7 @@ local function copy_glyph(main,target,original,unicode,slot) kerns = olddata.kerns, mathkerns = olddata.mathkerns, tounicode = olddata.tounicode, + smaller = olddata.smaller, commands = { { "slot", slot, nextglyph } }, } local newnextglyph = addprivate(main,formatters["M-N-%H"](nextglyph),newnextdata) @@ -703,7 +704,12 @@ local function copy_glyph(main,target,original,unicode,slot) vvi.glyph = addprivate(main,formatters["M-V-%H"](oldglyph),newdata) end end - return newdata + local smaller = olddata.smaller + if smaller then + local smallerdata = copy_glyph(main,target,original,smaller,slot) + glyphdata.smaller = addprivate(main,formatters["M-S-%H"](smaller),smallerdata) + end + return glyphdata end end diff --git a/tex/context/base/mkxl/mlib-int.lmt b/tex/context/base/mkxl/mlib-int.lmt index 9165d5423..686f1985d 100644 --- a/tex/context/base/mkxl/mlib-int.lmt +++ b/tex/context/base/mkxl/mlib-int.lmt @@ -7,8 +7,6 @@ if not modules then modules = { } end modules ['mlib-int'] = { } local factor = number.dimenfactors.bp -local mpstring = mp.string -local injectnumeric = mp.inject.numeric local isdimen = tex.isdimen local iscount = tex.iscount local getdimen = tex.getdimen @@ -53,49 +51,78 @@ end do - local d_paperheight = isdimen("paperheight") registerdirect("PaperHeight", function() return getdimen(d_paperheight) * factor end) - local d_paperwidth = isdimen("paperwidth") registerdirect("PaperWidth", function() return getdimen(d_paperwidth) * factor end) - local d_printpaperheight = isdimen("printpaperheight") registerdirect("PrintPaperHeight", function() return getdimen(d_printpaperheight) * factor end) - local d_printpaperwidth = isdimen("printpaperwidth") registerdirect("PrintPaperWidth", function() return getdimen(d_printpaperwidth) * factor end) - local d_topspace = isdimen("topspace") registerdirect("TopSpace", function() return getdimen(d_topspace) * factor end) - local d_bottomspace = isdimen("bottomspace") registerdirect("BottomSpace", function() return getdimen(d_bottomspace) * factor end) - local d_backspace = isdimen("backspace") registerdirect("BackSpace", function() return getdimen(d_backspace) * factor end) - local d_cutspace = isdimen("cutspace") registerdirect("CutSpace", function() return getdimen(d_cutspace) * factor end) - local d_makeupheight = isdimen("makeupheight") registerdirect("MakeupHeight", function() return getdimen(d_makeupheight) * factor end) - local d_makeupwidth = isdimen("makeupwidth") registerdirect("MakeupWidth", function() return getdimen(d_makeupwidth) * factor end) - local d_topheight = isdimen("topheight") registerdirect("TopHeight", function() return getdimen(d_topheight) * factor end) - local d_topdistance = isdimen("topdistance") registerdirect("TopDistance", function() return getdimen(d_topdistance) * factor end) - local d_headerheight = isdimen("headerheight") registerdirect("HeaderHeight", function() return getdimen(d_headerheight) * factor end) - local d_headerdistance = isdimen("headerdistance") registerdirect("HeaderDistance", function() return getdimen(d_headerdistance) * factor end) - local d_textheight = isdimen("textheight") registerdirect("TextHeight", function() return getdimen(d_textheight) * factor end) - local d_footerdistance = isdimen("footerdistance") registerdirect("FooterDistance", function() return getdimen(d_footerdistance) * factor end) - local d_footerheight = isdimen("footerheight") registerdirect("FooterHeight", function() return getdimen(d_footerheight) * factor end) - local d_bottomdistance = isdimen("bottomdistance") registerdirect("BottomDistance", function() return getdimen(d_bottomdistance) * factor end) - local d_bottomheight = isdimen("bottomheight") registerdirect("BottomHeight", function() return getdimen(d_bottomheight) * factor end) - local d_leftedgewidth = isdimen("leftedgewidth") registerdirect("LeftEdgeWidth", function() return getdimen(d_leftedgewidth) * factor end) - local d_leftedgedistance = isdimen("leftedgedistance") registerdirect("LeftEdgeDistance", function() return getdimen(d_leftedgedistance) * factor end) - local d_leftmarginwidth = isdimen("leftmarginwidth") registerdirect("LeftMarginWidth", function() return getdimen(d_leftmarginwidth) * factor end) - local d_leftmargindistance = isdimen("leftmargindistance") registerdirect("LeftMarginDistance", function() return getdimen(d_leftmargindistance) * factor end) - local d_textwidth = isdimen("textwidth") registerdirect("TextWidth", function() return getdimen(d_textwidth) * factor end) - local d_rightmargindistance = isdimen("rightmargindistance") registerdirect("RightMarginDistance", function() return getdimen(d_rightmargindistance) * factor end) - local d_rightmarginwidth = isdimen("rightmarginwidth") registerdirect("RightMarginWidth", function() return getdimen(d_rightmarginwidth) * factor end) - local d_rightedgedistance = isdimen("rightedgedistance") registerdirect("RightEdgeDistance", function() return getdimen(d_rightedgedistance) * factor end) - local d_rightedgewidth = isdimen("rightedgewidth") registerdirect("RightEdgeWidth", function() return getdimen(d_rightedgewidth) * factor end) - -end - -do - - local onrightpage = structures.pages.on_right - - registerdirect("InnerMarginDistance", function() return getdimen(onrightpage() and d_leftmargindistance or d_rightmargindistance) * factor end) - registerdirect("InnerMarginWidth", function() return getdimen(onrightpage() and d_leftmarginwidth or d_rightmarginwidth ) * factor end) - registerdirect("OuterMarginDistance", function() return getdimen(onrightpage() and d_rightmargindistance or d_leftmargindistance ) * factor end) - registerdirect("OuterMarginWidth", function() return getdimen(onrightpage() and d_rightmarginwidth or d_leftmarginwidth ) * factor end) - registerdirect("InnerEdgeDistance", function() return getdimen(onrightpage() and d_leftmargindistance or d_rightmargindistance) * factor end) - registerdirect("InnerEdgeWidth", function() return getdimen(onrightpage() and d_leftmarginwidth or d_rightmarginwidth ) * factor end) - registerdirect("OuterEdgeDistance", function() return getdimen(onrightpage() and d_rightedgedistance or d_leftedgedistance ) * factor end) - registerdirect("OuterEdgeWidth", function() return getdimen(onrightpage() and d_rightedgewidth or d_leftedgewidth ) * factor end) + -- These get swapped so the d_ numbers change. + + registerdirect("PaperHeight", function() return getdimen("paperheight") * factor end) + registerdirect("PaperWidth", function() return getdimen("paperwidth") * factor end) + registerdirect("PrintPaperHeight", function() return getdimen("printpaperheight") * factor end) + registerdirect("PrintPaperWidth", function() return getdimen("printpaperwidth") * factor end) + registerdirect("BackSpace", function() return getdimen("backspace") * factor end) + registerdirect("CutSpace", function() return getdimen("cutspace") * factor end) + + registerdirect("LeftEdgeWidth", function() return getdimen("leftedgewidth") * factor end) + registerdirect("LeftEdgeDistance", function() return getdimen("leftedgedistance") * factor end) + registerdirect("LeftMarginWidth", function() return getdimen("leftmarginwidth") * factor end) + registerdirect("LeftMarginDistance", function() return getdimen("leftmargindistance") * factor end) + registerdirect("RightMarginDistance", function() return getdimen("rightmargindistance") * factor end) + registerdirect("RightMarginWidth", function() return getdimen("rightmarginwidth") * factor end) + registerdirect("RightEdgeDistance", function() return getdimen("rightedgedistance") * factor end) + registerdirect("RightEdgeWidth", function() return getdimen("rightedgewidth") * factor end) + + -- leftmargintotal rightmargintotal -- not yet + -- leftedgetotal rightedgetotal + -- leftsidetotal rightsidetotal + -- leftcombitotal rightcombitotal + -- innermargintotal outermargintotal + -- inneredgetotal outeredgetotal + -- innercombitotal outercombitotal + -- innersidetotal outersidetotal + + local d_leftedgewidth = isdimen("leftedgewidth") + local d_leftedgedistance = isdimen("leftedgedistance") + local d_leftmarginwidth = isdimen("leftmarginwidth") + local d_leftmargindistance = isdimen("leftmargindistance") + local d_rightmargindistance = isdimen("rightmargindistance") + local d_rightmarginwidth = isdimen("rightmarginwidth") + local d_rightedgedistance = isdimen("rightedgedistance") + local d_rightedgewidth = isdimen("rightedgewidth") + + registerdirect("InnerMarginDistance", function() return getdimen(d_leftmargindistance ) * factor end) + registerdirect("InnerMarginWidth", function() return getdimen(d_leftmarginwidth ) * factor end) + registerdirect("OuterMarginDistance", function() return getdimen(d_rightmargindistance) * factor end) + registerdirect("OuterMarginWidth", function() return getdimen(d_rightmarginwidth ) * factor end) + registerdirect("InnerEdgeDistance", function() return getdimen(d_leftmargindistance ) * factor end) + registerdirect("InnerEdgeWidth", function() return getdimen(d_leftmarginwidth ) * factor end) + registerdirect("OuterEdgeDistance", function() return getdimen(d_rightedgedistance ) * factor end) + registerdirect("OuterEdgeWidth", function() return getdimen(d_rightedgewidth ) * factor end) + + -- local onrightpage = structures.pages.on_right + + -- registerdirect("InnerMarginDistance", function() return getdimen(onrightpage() and "leftmargindistance" or "rightmargindistance") * factor end) + -- registerdirect("InnerMarginWidth", function() return getdimen(onrightpage() and "leftmarginwidth" or "rightmarginwidth" ) * factor end) + -- registerdirect("OuterMarginDistance", function() return getdimen(onrightpage() and "rightmargindistance" or "leftmargindistance" ) * factor end) + -- registerdirect("OuterMarginWidth", function() return getdimen(onrightpage() and "rightmarginwidth" or "leftmarginwidth" ) * factor end) + -- registerdirect("InnerEdgeDistance", function() return getdimen(onrightpage() and "leftmargindistance" or "rightmargindistance") * factor end) + -- registerdirect("InnerEdgeWidth", function() return getdimen(onrightpage() and "leftmarginwidth" or "rightmarginwidth" ) * factor end) + -- registerdirect("OuterEdgeDistance", function() return getdimen(onrightpage() and "rightedgedistance" or "leftedgedistance" ) * factor end) + -- registerdirect("OuterEdgeWidth", function() return getdimen(onrightpage() and "rightedgewidth" or "leftedgewidth" ) * factor end) + + -- These have stable d_ numbers. + + local d_topspace = isdimen("topspace") registerdirect("TopSpace", function() return getdimen(d_topspace) * factor end) + local d_bottomspace = isdimen("bottomspace") registerdirect("BottomSpace", function() return getdimen(d_bottomspace) * factor end) + local d_makeupheight = isdimen("makeupheight") registerdirect("MakeupHeight", function() return getdimen(d_makeupheight) * factor end) + local d_makeupwidth = isdimen("makeupwidth") registerdirect("MakeupWidth", function() return getdimen(d_makeupwidth) * factor end) + local d_topheight = isdimen("topheight") registerdirect("TopHeight", function() return getdimen(d_topheight) * factor end) + local d_topdistance = isdimen("topdistance") registerdirect("TopDistance", function() return getdimen(d_topdistance) * factor end) + local d_headerheight = isdimen("headerheight") registerdirect("HeaderHeight", function() return getdimen(d_headerheight) * factor end) + local d_headerdistance = isdimen("headerdistance") registerdirect("HeaderDistance", function() return getdimen(d_headerdistance) * factor end) + local d_textheight = isdimen("textheight") registerdirect("TextHeight", function() return getdimen(d_textheight) * factor end) + local d_footerdistance = isdimen("footerdistance") registerdirect("FooterDistance", function() return getdimen(d_footerdistance) * factor end) + local d_footerheight = isdimen("footerheight") registerdirect("FooterHeight", function() return getdimen(d_footerheight) * factor end) + local d_bottomdistance = isdimen("bottomdistance") registerdirect("BottomDistance", function() return getdimen(d_bottomdistance) * factor end) + local d_bottomheight = isdimen("bottomheight") registerdirect("BottomHeight", function() return getdimen(d_bottomheight) * factor end) + local d_textwidth = isdimen("textwidth") registerdirect("TextWidth", function() return getdimen(d_textwidth) * factor end) end diff --git a/tex/context/base/mkxl/node-ali.lmt b/tex/context/base/mkxl/node-ali.lmt index 4b52f2d4b..69b1e7aa0 100644 --- a/tex/context/base/mkxl/node-ali.lmt +++ b/tex/context/base/mkxl/node-ali.lmt @@ -314,7 +314,7 @@ interfaces.implement { end, } --- Let's put it here (for now) (some locals above) .. will be cleaned up! +-- This will go to math-ali.lmt do @@ -538,7 +538,7 @@ deltas = { } for count=1,#records do if count == lindex then if centered and overflow then - lwidth = lwidth - tex.getdimen("d_math_eqalign_number_distance") + lwidth = lwidth - texgetdimen("d_math_eqalign_number_distance") end setwidth(records[count],lwidth) elseif count == rindex then diff --git a/tex/context/base/mkxl/scrn-ini.lmt b/tex/context/base/mkxl/scrn-ini.lmt index 82b9bd02e..2d01a1a28 100644 --- a/tex/context/base/mkxl/scrn-ini.lmt +++ b/tex/context/base/mkxl/scrn-ini.lmt @@ -52,3 +52,11 @@ interfaces.implement { actions = setidentityvariable, arguments = "2 strings", } + +interfaces.implement { + name = "setautoprefix", + actions = function(prefix) + backends.codeinjections.setautoprefix(prefix) + end, + arguments = "string", +} diff --git a/tex/context/base/mkxl/scrn-ini.mklx b/tex/context/base/mkxl/scrn-ini.mklx index 8a7f89c42..1308ff6ec 100644 --- a/tex/context/base/mkxl/scrn-ini.mklx +++ b/tex/context/base/mkxl/scrn-ini.mklx @@ -206,4 +206,8 @@ \scrn_identity_document {date}\c!date \to \everystartdocument % or stop +\appendtoks + \clf_setautoprefix{\interactionparameter\c!prefix}% +\to \everysetupinteraction + \protect \endinput diff --git a/tex/context/base/mkxl/tabl-ntb.mkxl b/tex/context/base/mkxl/tabl-ntb.mkxl index d36d113e1..a0e85e839 100644 --- a/tex/context/base/mkxl/tabl-ntb.mkxl +++ b/tex/context/base/mkxl/tabl-ntb.mkxl @@ -1219,7 +1219,8 @@ \ifcsname\tabl_ntb_row_pattern\c_tabl_ntb_current_row\c_tabl_ntb_current_col\endcsname \scratchcounter\numexpr\c_tabl_ntb_maximum_row-\c_tabl_ntb_current_row+\plusone\relax \ifnum\tabl_ntb_get_row\c_tabl_ntb_current_row\c_tabl_ntb_current_col>\scratchcounter - \tabl_ntb_set_row\c_tabl_ntb_current_row\c_tabl_ntb_current_col{\the\scratchcounter}% +% \tabl_ntb_set_row\c_tabl_ntb_current_row\c_tabl_ntb_current_col{\the\scratchcounter}% + \tabl_ntb_set_row\c_tabl_ntb_current_row\c_tabl_ntb_current_col\scratchcounter \fi \fi \tabl_ntb_let_ht\c_tabl_ntb_current_row\c_tabl_ntb_current_col\zeropoint diff --git a/tex/context/base/mkxl/trac-vis.lmt b/tex/context/base/mkxl/trac-vis.lmt index e00944413..e2c79022a 100644 --- a/tex/context/base/mkxl/trac-vis.lmt +++ b/tex/context/base/mkxl/trac-vis.lmt @@ -48,6 +48,7 @@ local getattr = nuts.getattr local getsubtype = nuts.getsubtype local getbox = nuts.getbox local getlist = nuts.getlist +local getprev = nuts.getprev local getnext = nuts.getnext local getboth = nuts.getboth local getwhd = nuts.getwhd @@ -1313,7 +1314,9 @@ local ruledstrut do if getsubtype(current) == strut_code then local w = strut_size local a = getattr(current,a_mathaxis) + setattr(current,a_layer,l_strut) if a then + local p = getprev(current) local b, e for n in traverseid(math_code,current) do e = n @@ -1336,17 +1339,17 @@ local ruledstrut do head, current, rule = nuts.remove(head,current) local kern = new_kern(-w) if a == 2 then - insertnodebefore(head,e,kern) - insertnodebefore(head,e,rule) + head = insertnodebefore(head,e,kern) + head = insertnodebefore(head,e,rule) else insertnodeafter(head,b,kern) insertnodeafter(head,b,rule) end + current = p else setwidth(current,w) - head, current = insertnodeafter(head,current,new_kern(w)) + head, current = insertnodeafter(head,current,new_kern(-w)) end - setattr(current,a_layer,l_strut) end end return head, current diff --git a/tex/context/base/mkxl/type-imp-euler.mkxl b/tex/context/base/mkxl/type-imp-euler.mkxl new file mode 100644 index 000000000..c0a3f73f6 --- /dev/null +++ b/tex/context/base/mkxl/type-imp-euler.mkxl @@ -0,0 +1,67 @@ +%D \module +%D [ file=type-otf, +%D version=2007.07.30, +%D title=\CONTEXT\ Typescript Macros, +%D subtitle=Euler, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\loadtypescriptfile[texgyre] +\loadtypescriptfile[dejavu] + +\definefontfeature[pagellaovereuler][pagellaovereuler=yes] +\definefontfeature[euleroverpagella][euleroverpagella=yes] + +\starttypescriptcollection[pagella-eulernova] + + \starttypescript [\s!serif] [eulernova] [\s!name] + \setups[\s!font:\s!fallback:\s!serif] + \definefontsynonym [\s!Serif] [\s!file:euler.otf] [\s!features=\s!default] + \stoptypescript + + \starttypescript [\s!math] [eulernova] [\s!name] + \definefontsynonym [\s!MathRoman] [\s!file:euler.otf] [\s!features={\s!math\mathsizesuffix,mathextra},\s!goodies=euler-math] + \stoptypescript + + \starttypescript [pagella-eulernova] + \definetypeface [\typescriptone] [\s!rm] [\s!serif] [pagella] [\s!default] + \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default] [\s!rscale=0.9] + \definetypeface [\typescriptone] [\s!mm] [\s!math] [eulernova] [\s!default] + \quittypescriptscanning + \stoptypescript + + \starttypescript [eulernova] + \definetypeface [\typescriptone] [\s!rm] [\s!serif] [eulernova] [\s!default] + \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default] [\s!rscale=0.9] + \definetypeface [\typescriptone] [\s!mm] [\s!math] [eulernova] [\s!default] + \quittypescriptscanning + \stoptypescript + + \starttypescript [\s!math] [euleroverpagella] [\s!name] + \definefontsynonym [\s!MathRoman] [texgyrepagella-math] [\s!features={\s!math\mathsizesuffix,euleroverpagella,mathextra},\s!fallbacks=euleroverpagella,\s!goodies=pagella-math] + \stoptypescript + + \starttypescript [\s!math] [pagellaovereuler] [\s!name] + \definefontsynonym [\s!MathRoman] [\s!file:euler.otf] [\s!features={\s!math\mathsizesuffix,pagellaovereuler,mathextra},\s!fallbacks=pagellaovereuler,\s!goodies=euler-math] + \stoptypescript + + \starttypescript [pagella-with-euler,euleroverpagella] + \definetypeface [\typescriptone] [\s!rm] [\s!serif] [pagella] [\s!default] + \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default] [\s!rscale=0.9] + \definetypeface [\typescriptone] [\s!mm] [\s!math] [euleroverpagella] [\s!default] + \quittypescriptscanning + \stoptypescript + + \starttypescript [euler-with-pagella,pagellaovereuler] + \definetypeface [\typescriptone] [\s!rm] [\s!serif] [eulernova] [\s!default] + \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default] [\s!rscale=0.9] + \definetypeface [\typescriptone] [\s!mm] [\s!math] [pagellaovereuler] [\s!default] + \quittypescriptscanning + \stoptypescript + +\stoptypescriptcollection diff --git a/tex/context/base/mkxl/typo-itc.lmt b/tex/context/base/mkxl/typo-itc.lmt index f2f6c428e..f0b6980f4 100644 --- a/tex/context/base/mkxl/typo-itc.lmt +++ b/tex/context/base/mkxl/typo-itc.lmt @@ -82,7 +82,7 @@ function typesetters.italics.forcevariant(variant) forcedvariant = variant end --- We use the same key as the tex font handler. So, if a valua has already be set, we +-- We use the same key as the tex font handler. So, if a value has already be set, we -- use that one. local function setitalicinfont(font,char) @@ -108,6 +108,7 @@ local function setitalicinfont(font,char) end end end + -- we don't want to do this each time so we also set zero here if trace_italics then report_italics("setting italic correction of %C of font %a to %p",char,font,italic) end diff --git a/tex/context/fonts/mkiv/asana-math.lfg b/tex/context/fonts/mkiv/asana-math.lfg index 379dd014f..970d031ea 100644 --- a/tex/context/fonts/mkiv/asana-math.lfg +++ b/tex/context/fonts/mkiv/asana-math.lfg @@ -1,35 +1,3 @@ --- This patch code is moved from font-pat.lua to this goodies --- files as it does not belong in the core code. --- --- local patches = fonts.handlers.otf.enhancers.patches --- --- local function patch(data,filename,threshold) --- local m = data.metadata.math --- if m then --- local d = m.DisplayOperatorMinHeight or 0 --- if d < threshold then --- patches.report("DisplayOperatorMinHeight(%s -> %s)",d,threshold) --- m.DisplayOperatorMinHeight = threshold --- end --- end --- end --- --- patches.register("after","analyze math","asana",function(data,filename) patch(data,filename,1350) end) --- --- local function less(value,target,original) --- -- officially we should check the original --- return 0.25 * value --- end - --- Just don't use this font. It's not good enough for production unless we patch it --- a lot, which we will not do unless we need it. - --- When set this will bypass the italic correction hackery! - --- local integral_variants = { bottomright = -0.20 } --- local integral_top = { topright = 0.05 } --- local integral_bottom = { bottomright = -0.25 } - local common = fonts.goodies.load("common-math.lfg") local presets = common.mathematics.tweaks.presets @@ -70,32 +38,40 @@ return { { tweak = "addmirrors", }, - presets.matheulercalligraphic { rscale = 1 }, - presets.mathrsfscript { rscale = 1 }, - presets.mathxitsarabic { rscale = 0.95 }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { }, + presets.rsfsuprighttoscript { }, + presets.moderntocalligraphic { }, + presets.eulertocalligraphic { }, + presets.xitsarabic { }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { factor = 2 }, + presets.wipeitalics { }, { tweak = "dimensions", list = { -- nothing yet } }, - -- { - -- tweak = "kerns", - -- list = { - -- [0x2F] = { - -- topleft = -0.2, - -- bottomleft = 0, - -- topright = 0, - -- bottomright = -0.2, - -- }, - -- }, - -- }, - -- { - -- tweak = "fixprimes", - -- factor = 0.85, - -- scale = 0.65, - -- smaller = true, - -- }, + -- { + -- tweak = "kerns", + -- list = { + -- [0x2F] = { + -- topleft = -0.2, + -- bottomleft = 0, + -- topright = 0, + -- bottomright = -0.2, + -- }, + -- }, + -- }, + -- { + -- tweak = "fixprimes", + -- factor = 0.85, + -- scale = 0.65, + -- smaller = true, + -- }, { tweak = "checkspacing", }, @@ -115,6 +91,12 @@ return { tweak = "setoptions", set = { "ignorekerndimensions" } }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, }, }, bigslots = { diff --git a/tex/context/fonts/mkiv/bonum-math.lfg b/tex/context/fonts/mkiv/bonum-math.lfg index 508293f19..e5d764aff 100644 --- a/tex/context/fonts/mkiv/bonum-math.lfg +++ b/tex/context/fonts/mkiv/bonum-math.lfg @@ -1,29 +1,10 @@ -local dimensions, kerns if CONTEXTLMTXMODE == 0 then - - local kern_V = { bottomright = { { kern = -200 } } } - local kern_W = { bottomright = { { kern = -100 } } } - local offset_f = { xoffset = "llx" } - - dimensions = { - default = { - [0x1D453] = offset_f, -- 𝑓 - }, - } - - kerns = { - [0x1D449] = kern_V, -- 𝑉 - [0x1D44A] = kern_W, -- 𝑊 - } - -end +local common = fonts.goodies.load("common-math.lfg") +local presets = common.mathematics.tweaks.presets local integral_variants = { bottomright = -0.20 } local integral_top = { topright = 0.05 } local integral_bottom = { bottomright = -0.30 } -local common = fonts.goodies.load("common-math.lfg") -local presets = common.mathematics.tweaks.presets - return { name = "bonum-math", version = "1.00", @@ -79,53 +60,29 @@ return { }, }, }, - presets.matheulercalligraphic { rscale = 0.98 }, - presets.mathrsfscript { rscale = 0.98 }, - presets.mathxitsarabic { rscale = 1 }, - presets.moveitalics { correct = true }, - { - -- For some alphabets we remove italic correction. - -- tweak = "wipeitalics", - list = { - "digitsbold", - "digitsdoublestruck", - "digitsmonospace", - "digitsnormal", - "digitssansserifbold", - "digitssansserifnormal", - "lowercasebold", - "lowercaseboldfraktur", - "lowercasedoublestruck", - "lowercasefraktur", - "lowercasemonospace", - -- "lowercasenormal", - "lowercasesansserifbold", - -- "lowercasesansserifnormal", - "lowercasegreeknormal", - "uppercasebold", - "uppercaseboldfraktur", - "uppercasedoublestruck", - "uppercasefraktur", - "uppercasegreekbold", - "uppercasegreeknormal", - "uppercasegreeksansserifbold", - "uppercasemonospace", - "uppercasesansserifbold", - "uppercasesanserifnormal", -- some remain - }, - }, - { - -- tweak = "topaccents", - list = { - [0x1D453] = 0.7, -- f - }, - }, - { - tweak = "limits", - list = { - [0x0222B] = 1.5, - }, - }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { rscale = 0.98 }, + presets.rsfsuprighttoscript { rscale = 0.98 }, + presets.moderntocalligraphic { rscale = 0.98 }, + presets.eulertocalligraphic { rscale = 0.98 }, + presets.xitsarabic { rscale = 1 }, + presets.fallbacks { }, + presets.moveintegrals { factor = 1.5 }, + presets.moveitalics { correct = true }, + presets.wipeanchors { }, + presets.wipeitalics { }, + -- { + -- tweak = "topaccents", + -- list = { + -- [0x1D453] = 0.7, -- f + -- }, + -- }, + -- { + -- tweak = "limits", + -- list = { + -- [0x0222B] = 1.5, + -- }, + -- }, { -- We need to check these, are the tweaks necessary or not? tweak = "dimensions", @@ -199,9 +156,9 @@ return { { tweak = "dimensions", list = { - [0x00302] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widehat - [0x00303] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widetilde - [0x00306] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widebreve + [0x00302] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widehat + [0x00303] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widetilde + [0x00306] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widebreve [0x0030C] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widecheck }, }, @@ -232,41 +189,6 @@ return { tweak = "copyaccents", }, -- So far for the accents. - { - -- For upright alphabets, we unset the anchor. This means that accents are placed - -- centered over the character. Should be on top. - tweak = "wipeanchors", - list = { - "digitsbold", - "digitsdoublestruck", - "digitsmonospace", - "digitsnormal", - "digitssansserifbold", - "digitssansserifnormal", - "lowercasebold", - "lowercaseboldfraktur", - "lowercasedoublestruck", - "lowercasefraktur", - "lowercasegreekbold", - "lowercasegreeknormal", - "lowercasegreeksansserifbold", - "lowercasemonospace", --- "lowercasenormal", - "lowercasesansserifbold", - "lowercasesansserifnormal", - "uppercasebold", - "uppercaseboldfraktur", - "uppercasedoublestruck", - "uppercasefraktur", - "uppercasegreekbold", - "uppercasegreeknormal", - "uppercasegreeksansserifbold", - "uppercasemonospace", - "uppercasenormal", - "uppercasesansserifbold", - "uppercasesansserifnormal", - }, - }, { -- This one fakes margins to get larger/smaller accents with for example the -- \widetilde. @@ -467,9 +389,19 @@ return { tweak = "addequals", }, { - tweak = "addfourier", + tweak = "addfourier", variant = 1, }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, + -- + -- { + -- tweak = "diagnose", + -- }, }, }, @@ -479,134 +411,127 @@ return { bigslots = { 1, 3, 5, 7 }, - -- - -- experimental fixes for mkiv: - -- - dimensions = dimensions, - kerns = kerns, }, } +-- For now we keep these commented as they show where we came from. + -- \alpha is looking like an italic a. The one from Dejavu could perhaps be an alternative? -- No hvariants in 772 - - - --- From the dimension tweak: --- [0x00393] = { xoffset = -0.05, width = 0.875, italic = 0 }, -- \Gamma --- [0x00394] = { xoffset = -0.05, width = 0.875, italic = 0 }, -- \Delta --- [0x00398] = { xoffset = -0.05, width = 0.9, italic = 0 }, -- \Theta --- [0x0039B] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \Lambda --- [0x0039E] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \Xi --- [0x003A0] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \Pi --- [0x003A3] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \Sigma --- [0x003A5] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \Upsilon --- [0x003A6] = { xoffset = -0.05, width = 0.9, italic = 0 }, -- \Phi --- [0x003A8] = { xoffset = -0.05, width = 0.9, italic = 0 }, -- \Psi --- [0x003A9] = { xoffset = -0.05, width = 0.9, italic = 0 }, -- \Omega --- [0x02202] = { xoffset = -0.075, width = 0.825, italic = 0 }, -- \partial --- [0x1D43A] = { xoffset = -0.1, width = 1, italic = 0 }, -- G --- [0x1D442] = { xoffset = -0.1, width = 1, italic = 0 }, -- O --- [0x1D444] = { xoffset = -0.05, width = 1.025, italic = 0 }, -- Q --- -- [0x1D44E] = { xoffset = -0.05, width = 1.1, italic = 0, anchor = 0.8 }, -- a --- -- [0x1D44F] = { xoffset = -0.05, width = 1.1, italic = 0 }, -- b --- -- [0x1D450] = { xoffset = -0.05, width = 1.1, italic = 0, anchor = 0.9 }, -- c --- -- [0x1D451] = { xoffset = -0.05, width = 1.1, italic = 0, anchor = 0.75 }, -- d --- -- [0x1D452] = { xoffset = -0.05, width = 1.1, italic = 0, anchor = 0.9 }, -- e --- -- [0x1D453] = { xoffset = 0.45, width = 1.9, italic = 0.45, anchor = 1.1 }, -- f --- -- [0x1D454] = { xoffset = 0.05, width = 1.1, italic = 0, anchor = 0.9 }, -- g --- -- [0x0210E] = { xoffset = -0.1, width = 1.05, italic = 0, anchor = 1.15 }, -- h --- -- [0x1D456] = { xoffset = -0.2, width = 1.1, italic = 0 }, -- i --- -- [0x1D457] = { xoffset = 0.6, width = 1.7, italic = 0.45 }, -- j --- -- [0x1D458] = { xoffset = -0.05, width = 1.1, italic = 0, anchor = 1.15 }, -- k --- -- [0x1D459] = { xoffset = -0.15, width = 1.1, italic = 0, anchor = 0.8 }, -- l --- -- [0x1D45A] = { xoffset = -0.05, width = 1, italic = 0 }, -- m --- -- [0x1D45B] = { xoffset = -0.1, width = 1, italic = 0, anchor = 0.9 }, -- n --- -- [0x1D45C] = { xoffset = -0.05, width = 1.1, italic = 0, anchor = 0.9 }, -- o --- -- [0x1D45D] = { width = 1.05, italic = 0 }, -- p --- -- [0x1D45E] = { xoffset = -0.05, width = 1.05, italic = 0, anchor = 0.9 }, -- q --- -- [0x1D45F] = { xoffset = -0.1, width = 1.15, italic = 0, anchor = 0.9 }, -- r --- -- [0x1D460] = { xoffset = -0.05, width = 1.05, italic = 0 }, -- s --- -- [0x1D461] = { xoffset = -0.15, width = 1.2, italic = 0, anchor = 0.9 }, -- t --- -- [0x1D462] = { xoffset = -0.1, width = 1.05, italic = 0, anchor = 0.85 }, -- u --- -- [0x1D463] = { xoffset = -0.1, width = 1.05, italic = 0, anchor = 0.85 }, -- v --- -- [0x1D464] = { xoffset = -0.05, width = 1.05, italic = 0, anchor = 0.95 }, -- w --- -- [0x1D465] = { width = 1.175, italic = 0, anchor = 0.9 }, -- x --- -- [0x1D466] = { xoffset = -0.05, width = 1.05, italic = 0 }, -- y --- -- [0x1D467] = { xoffset = -0.05, width = 1.1, italic = 0, anchor = 0.9 }, -- z --- [0x1D6FC] = { xoffset = -0.075, width = 0.825, italic = 0 }, -- \alpha --- [0x1D6FD] = { width = 0.9, italic = 0, anchor = 1.05 }, -- \beta --- [0x1D6FE] = { xoffset = -0.075, width = 0.85, italic = 0.05, anchor = 1.05 }, -- \gamma --- [0x1D6FF] = { xoffset = -0.1, width = 0.85, italic = 0 }, -- \delta --- [0x1D716] = { xoffset = -0.1, width = 0.85, italic = 0 }, -- \epsilon --- [0x1D700] = { xoffset = -0.1, width = 0.85, italic = 0 }, -- \varepsilon --- [0x1D701] = { xoffset = -0.1, width = 0.85, italic = 0 }, -- \zeta --- [0x1D702] = { xoffset = -0.1, width = 0.85, italic = 0, anchor = 1.05 }, -- \eta --- [0x1D703] = { xoffset = -0.1, width = 0.85, italic = 0 }, -- \theta --- [0x1D717] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.03 }, -- \vartheta --- [0x1D704] = { xoffset = -0.1, width = 0.9, italic = 0, anchor = 1.05 }, -- \iota --- [0x1D705] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \kappa --- [0x1D706] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.05 }, -- \lambda --- [0x1D707] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.03 }, -- \mu --- [0x1D708] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.03 }, -- \nu --- [0x1D709] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \xi --- [0x1D70A] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.03 }, -- \omicron --- [0x1D70B] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \pi --- [0x1D71B] = { xoffset = -0.07, width = 0.85, italic = 0 }, -- \varpi --- [0x1D70C] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \rho --- [0x1D71A] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \varrho --- [0x1D70D] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.02 }, -- \varsigma --- [0x1D70E] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \sigma --- [0x1D70F] = { xoffset = -0.08, width = 0.85, italic = 0, anchor = 1.05 }, -- \tau --- [0x1D710] = { xoffset = -0.08, width = 0.85, italic = 0, anchor = 1.03 }, -- \upsilon --- [0x1D719] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \phi --- [0x1D711] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.02 }, -- \varphi --- [0x1D712] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \chi --- [0x1D713] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \psi --- [0x1D714] = { xoffset = -0.05, width = 0.875, italic = 0 }, -- \omega --- -- [0x1D718] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.03 }, -- \varkappa --- [0x1D719] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \phi --- [0x1D41B] = { width = 1, italic = 0, anchor = 1.5 }, -- bold lowercase upright b --- [0x1D41D] = { width = 1, italic = 0, anchor = 0.6 }, -- bold lowercase upright d --- [0x1D41F] = { width = 1.25, italic = 0, anchor = 0.8 }, -- bold lowercase upright f --- [0x1D420] = { width = 1, italic = 0, anchor = 0.6 }, -- bold lowercase upright g --- [0x1D421] = { width = 1, italic = 0, anchor = 1.5 }, -- bold lowercase upright h --- [0x1D424] = { width = 1, italic = 0, anchor = 1.5 }, -- bold lowercase upright k --- [0x1D425] = { width = 1, italic = 0, anchor = 0.75 }, -- bold lowercase upright l --- [0x1D42A] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase upright q --- [0x1D42B] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase upright r --- [0x1D42C] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase upright s --- -- [0x1D482] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase italic a --- -- [0x1D483] = { width = 1, italic = 0, anchor = 1.1 }, -- bold lowercase italic b --- -- [0x1D484] = { width = 1, italic = 0, anchor = 0.95 }, -- bold lowercase italic c --- -- [0x1D485] = { width = 1, italic = 0, anchor = 0.75 }, -- bold lowercase italic d --- -- [0x1D486] = { width = 1, italic = 0, anchor = 0.95 }, -- bold lowercase italic e --- -- [0x1D487] = { width = 1, italic = 0, anchor = 0.95 }, -- bold lowercase italic f --- -- [0x1D488] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase italic g --- -- [0x1D489] = { width = 1, italic = 0, anchor = 1.2 }, -- bold lowercase italic h --- -- [0x1D48A] = { width = 1, italic = 0, anchor = 0.6 }, -- bold lowercase italic i --- -- [0x1D48B] = { width = 1, italic = 0, anchor = 0.8 }, -- bold lowercase italic j --- -- [0x1D48C] = { width = 1, italic = 0, anchor = 1.2 }, -- bold lowercase italic k --- -- [0x1D48D] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase italic l --- -- [0x1D492] = { width = 1, italic = 0, anchor = 0.85 }, -- bold lowercase italic q --- -- [0x1D493] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase italic r --- -- [0x1D497] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase italic v --- -- [0x1D499] = { width = 1.1, italic = 0, anchor = 0.9 }, -- bold lowercase italic x --- -- [0x1D49A] = { width = 1, italic = 0, anchor = 0.95 }, -- bold lowercase italic y --- -- [0x1D49B] = { width = 1, italic = 0, anchor = 1.1 }, -- bold lowercase italic z --- [0x1D743] = { width = 1, italic = 0, anchor = 1.7 }, -- bold lowercase italic greek xi --- -- [0x1D435] = { anchor = 1.05 }, -- italic B --- -- [0x1D436] = { xoffset = -0.1, anchor = 0.7 }, -- italic C --- -- [0x1D437] = { anchor = 1.25 }, -- italic D --- -- [0x1D43A] = { anchor = 0.8 }, -- italic G --- -- [0x1D442] = { anchor = 0.85 }, -- italic O --- -- [0x1D443] = { anchor = 1.1 }, -- italic P --- -- [0x1D444] = { anchor = 0.85 }, -- italic Q --- -- [0x1D445] = { xoffset = -0.025, width = 1.05, anchor = 1.05 }, -- italic R --- -- [0x1D446] = { xoffset = -0.05, anchor = 0.85 }, -- italic S --- -- [0x1D447] = { xoffset = -0.05, width = 1.05, italic = 0.7, anchor = 0.9, }, -- italic T --- -- [0x1D448] = { xoffset = -0.125, italic = 0.3, anchor = 0.9, }, -- italic U --- -- [0x1D449] = { xoffset = -0.125, italic = 0.3, anchor = 0.9, }, -- italic V --- -- [0x1D44A] = { xoffset = -0.075, italic = 0.3, anchor = 0.9, }, -- italic W --- -- [0x1D44C] = { xoffset = -0.075, width = 1.1, italic = 0.35, anchor = 0.9, }, -- italic Y +-- [0x00393] = { xoffset = -0.05, width = 0.875, italic = 0 }, -- \Gamma +-- [0x00394] = { xoffset = -0.05, width = 0.875, italic = 0 }, -- \Delta +-- [0x00398] = { xoffset = -0.05, width = 0.9, italic = 0 }, -- \Theta +-- [0x0039B] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \Lambda +-- [0x0039E] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \Xi +-- [0x003A0] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \Pi +-- [0x003A3] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \Sigma +-- [0x003A5] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \Upsilon +-- [0x003A6] = { xoffset = -0.05, width = 0.9, italic = 0 }, -- \Phi +-- [0x003A8] = { xoffset = -0.05, width = 0.9, italic = 0 }, -- \Psi +-- [0x003A9] = { xoffset = -0.05, width = 0.9, italic = 0 }, -- \Omega +-- [0x02202] = { xoffset = -0.075, width = 0.825, italic = 0 }, -- \partial +-- [0x1D43A] = { xoffset = -0.1, width = 1, italic = 0 }, -- G +-- [0x1D442] = { xoffset = -0.1, width = 1, italic = 0 }, -- O +-- [0x1D444] = { xoffset = -0.05, width = 1.025, italic = 0 }, -- Q +-- [0x1D44E] = { xoffset = -0.05, width = 1.1, italic = 0, anchor = 0.8 }, -- a +-- [0x1D44F] = { xoffset = -0.05, width = 1.1, italic = 0 }, -- b +-- [0x1D450] = { xoffset = -0.05, width = 1.1, italic = 0, anchor = 0.9 }, -- c +-- [0x1D451] = { xoffset = -0.05, width = 1.1, italic = 0, anchor = 0.75 }, -- d +-- [0x1D452] = { xoffset = -0.05, width = 1.1, italic = 0, anchor = 0.9 }, -- e +-- [0x1D453] = { xoffset = 0.45, width = 1.9, italic = 0.45, anchor = 1.1 }, -- f +-- [0x1D454] = { xoffset = 0.05, width = 1.1, italic = 0, anchor = 0.9 }, -- g +-- [0x0210E] = { xoffset = -0.1, width = 1.05, italic = 0, anchor = 1.15 }, -- h +-- [0x1D456] = { xoffset = -0.2, width = 1.1, italic = 0 }, -- i +-- [0x1D457] = { xoffset = 0.6, width = 1.7, italic = 0.45 }, -- j +-- [0x1D458] = { xoffset = -0.05, width = 1.1, italic = 0, anchor = 1.15 }, -- k +-- [0x1D459] = { xoffset = -0.15, width = 1.1, italic = 0, anchor = 0.8 }, -- l +-- [0x1D45A] = { xoffset = -0.05, width = 1, italic = 0 }, -- m +-- [0x1D45B] = { xoffset = -0.1, width = 1, italic = 0, anchor = 0.9 }, -- n +-- [0x1D45C] = { xoffset = -0.05, width = 1.1, italic = 0, anchor = 0.9 }, -- o +-- [0x1D45D] = { width = 1.05, italic = 0 }, -- p +-- [0x1D45E] = { xoffset = -0.05, width = 1.05, italic = 0, anchor = 0.9 }, -- q +-- [0x1D45F] = { xoffset = -0.1, width = 1.15, italic = 0, anchor = 0.9 }, -- r +-- [0x1D460] = { xoffset = -0.05, width = 1.05, italic = 0 }, -- s +-- [0x1D461] = { xoffset = -0.15, width = 1.2, italic = 0, anchor = 0.9 }, -- t +-- [0x1D462] = { xoffset = -0.1, width = 1.05, italic = 0, anchor = 0.85 }, -- u +-- [0x1D463] = { xoffset = -0.1, width = 1.05, italic = 0, anchor = 0.85 }, -- v +-- [0x1D464] = { xoffset = -0.05, width = 1.05, italic = 0, anchor = 0.95 }, -- w +-- [0x1D465] = { width = 1.175, italic = 0, anchor = 0.9 }, -- x +-- [0x1D466] = { xoffset = -0.05, width = 1.05, italic = 0 }, -- y +-- [0x1D467] = { xoffset = -0.05, width = 1.1, italic = 0, anchor = 0.9 }, -- z +-- [0x1D6FC] = { xoffset = -0.075, width = 0.825, italic = 0 }, -- \alpha +-- [0x1D6FD] = { width = 0.9, italic = 0, anchor = 1.05 }, -- \beta +-- [0x1D6FE] = { xoffset = -0.075, width = 0.85, italic = 0.05, anchor = 1.05 }, -- \gamma +-- [0x1D6FF] = { xoffset = -0.1, width = 0.85, italic = 0 }, -- \delta +-- [0x1D716] = { xoffset = -0.1, width = 0.85, italic = 0 }, -- \epsilon +-- [0x1D700] = { xoffset = -0.1, width = 0.85, italic = 0 }, -- \varepsilon +-- [0x1D701] = { xoffset = -0.1, width = 0.85, italic = 0 }, -- \zeta +-- [0x1D702] = { xoffset = -0.1, width = 0.85, italic = 0, anchor = 1.05 }, -- \eta +-- [0x1D703] = { xoffset = -0.1, width = 0.85, italic = 0 }, -- \theta +-- [0x1D717] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.03 }, -- \vartheta +-- [0x1D704] = { xoffset = -0.1, width = 0.9, italic = 0, anchor = 1.05 }, -- \iota +-- [0x1D705] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \kappa +-- [0x1D706] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.05 }, -- \lambda +-- [0x1D707] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.03 }, -- \mu +-- [0x1D708] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.03 }, -- \nu +-- [0x1D709] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \xi +-- [0x1D70A] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.03 }, -- \omicron +-- [0x1D70B] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \pi +-- [0x1D71B] = { xoffset = -0.07, width = 0.85, italic = 0 }, -- \varpi +-- [0x1D70C] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \rho +-- [0x1D71A] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \varrho +-- [0x1D70D] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.02 }, -- \varsigma +-- [0x1D70E] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \sigma +-- [0x1D70F] = { xoffset = -0.08, width = 0.85, italic = 0, anchor = 1.05 }, -- \tau +-- [0x1D710] = { xoffset = -0.08, width = 0.85, italic = 0, anchor = 1.03 }, -- \upsilon +-- [0x1D719] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \phi +-- [0x1D711] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.02 }, -- \varphi +-- [0x1D712] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \chi +-- [0x1D713] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \psi +-- [0x1D714] = { xoffset = -0.05, width = 0.875, italic = 0 }, -- \omega +-- -- [0x1D718] = { xoffset = -0.075, width = 0.85, italic = 0, anchor = 1.03 }, -- \varkappa +-- [0x1D719] = { xoffset = -0.075, width = 0.85, italic = 0 }, -- \phi +-- [0x1D41B] = { width = 1, italic = 0, anchor = 1.5 }, -- bold lowercase upright b +-- [0x1D41D] = { width = 1, italic = 0, anchor = 0.6 }, -- bold lowercase upright d +-- [0x1D41F] = { width = 1.25, italic = 0, anchor = 0.8 }, -- bold lowercase upright f +-- [0x1D420] = { width = 1, italic = 0, anchor = 0.6 }, -- bold lowercase upright g +-- [0x1D421] = { width = 1, italic = 0, anchor = 1.5 }, -- bold lowercase upright h +-- [0x1D424] = { width = 1, italic = 0, anchor = 1.5 }, -- bold lowercase upright k +-- [0x1D425] = { width = 1, italic = 0, anchor = 0.75 }, -- bold lowercase upright l +-- [0x1D42A] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase upright q +-- [0x1D42B] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase upright r +-- [0x1D42C] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase upright s +-- -- [0x1D482] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase italic a +-- -- [0x1D483] = { width = 1, italic = 0, anchor = 1.1 }, -- bold lowercase italic b +-- -- [0x1D484] = { width = 1, italic = 0, anchor = 0.95 }, -- bold lowercase italic c +-- -- [0x1D485] = { width = 1, italic = 0, anchor = 0.75 }, -- bold lowercase italic d +-- -- [0x1D486] = { width = 1, italic = 0, anchor = 0.95 }, -- bold lowercase italic e +-- -- [0x1D487] = { width = 1, italic = 0, anchor = 0.95 }, -- bold lowercase italic f +-- -- [0x1D488] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase italic g +-- -- [0x1D489] = { width = 1, italic = 0, anchor = 1.2 }, -- bold lowercase italic h +-- -- [0x1D48A] = { width = 1, italic = 0, anchor = 0.6 }, -- bold lowercase italic i +-- -- [0x1D48B] = { width = 1, italic = 0, anchor = 0.8 }, -- bold lowercase italic j +-- -- [0x1D48C] = { width = 1, italic = 0, anchor = 1.2 }, -- bold lowercase italic k +-- -- [0x1D48D] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase italic l +-- -- [0x1D492] = { width = 1, italic = 0, anchor = 0.85 }, -- bold lowercase italic q +-- -- [0x1D493] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase italic r +-- -- [0x1D497] = { width = 1, italic = 0, anchor = 0.9 }, -- bold lowercase italic v +-- -- [0x1D499] = { width = 1.1, italic = 0, anchor = 0.9 }, -- bold lowercase italic x +-- -- [0x1D49A] = { width = 1, italic = 0, anchor = 0.95 }, -- bold lowercase italic y +-- -- [0x1D49B] = { width = 1, italic = 0, anchor = 1.1 }, -- bold lowercase italic z +-- [0x1D743] = { width = 1, italic = 0, anchor = 1.7 }, -- bold lowercase italic greek xi +-- -- [0x1D435] = { anchor = 1.05 }, -- italic B +-- -- [0x1D436] = { xoffset = -0.1, anchor = 0.7 }, -- italic C +-- -- [0x1D437] = { anchor = 1.25 }, -- italic D +-- -- [0x1D43A] = { anchor = 0.8 }, -- italic G +-- -- [0x1D442] = { anchor = 0.85 }, -- italic O +-- -- [0x1D443] = { anchor = 1.1 }, -- italic P +-- -- [0x1D444] = { anchor = 0.85 }, -- italic Q +-- -- [0x1D445] = { xoffset = -0.025, width = 1.05, anchor = 1.05 }, -- italic R +-- -- [0x1D446] = { xoffset = -0.05, anchor = 0.85 }, -- italic S +-- -- [0x1D447] = { xoffset = -0.05, width = 1.05, italic = 0.7, anchor = 0.9, }, -- italic T +-- -- [0x1D448] = { xoffset = -0.125, italic = 0.3, anchor = 0.9, }, -- italic U +-- -- [0x1D449] = { xoffset = -0.125, italic = 0.3, anchor = 0.9, }, -- italic V +-- -- [0x1D44A] = { xoffset = -0.075, italic = 0.3, anchor = 0.9, }, -- italic W +-- -- [0x1D44C] = { xoffset = -0.075, width = 1.1, italic = 0.35, anchor = 0.9, }, -- italic Y diff --git a/tex/context/fonts/mkiv/cambria-math.lfg b/tex/context/fonts/mkiv/cambria-math.lfg index 8f9cf73b9..9cece8369 100644 --- a/tex/context/fonts/mkiv/cambria-math.lfg +++ b/tex/context/fonts/mkiv/cambria-math.lfg @@ -1,51 +1,3 @@ -local dimensions, kerns, kernpairs if CONTEXTLMTXMODE == 0 then - - kernpairs = { -- \setupmathematics[kernpairs=yes] - [0x1D44E] = { - [0x1D44F] = 1000, -- 𝑎𝑏 demo - } - } - - kerns = { - [0x1D453] = { - force = true, - topright = { - { - kern = 1000, - }, - }, - bottomright = { - { - kern = 1000, - }, - }, - }, - } - -end - --- local patches = fonts.handlers.otf.enhancers.patches --- --- local function patch(data,filename,threshold) --- local m = data.metadata.math --- if m then --- local d = m.DisplayOperatorMinHeight or 0 --- if d < threshold then --- patches.report("DisplayOperatorMinHeight(%s -> %s)",d,threshold) --- m.DisplayOperatorMinHeight = threshold --- end --- end --- end --- --- patches.register("after","analyze math","cambria", function(data,filename) patch(data,filename,2800) end) --- patches.register("after","analyze math","cambmath",function(data,filename) patch(data,filename,2800) end) - --- -- We could stick to the italic correction here --- --- local integral_variants = { bottomright = -0.20 } --- local integral_top = { topright = 0.05 } --- local integral_bottom = { bottomright = -0.30 } - local common = fonts.goodies.load("common-math.lfg") local presets = common.mathematics.tweaks.presets @@ -59,9 +11,9 @@ return { parameters = { NoLimitSupFactor = 0, NoLimitSubFactor = 1000, - -- AccentTopShiftUp = 0, - -- FlattenedAccentTopShiftUp = 0, - -- AccentExtendMargin = 50, + -- AccentTopShiftUp = 0, + -- FlattenedAccentTopShiftUp = 0, + -- AccentExtendMargin = 50, AccentBaseDepth = 300, RadicalDegreeBottomRaisePercent = 65, RadicalKernAfterDegree = -900, @@ -77,15 +29,20 @@ return { { tweak = "addmirrors", }, - presets.matheulercalligraphic { rscale = 0.97 }, - presets.mathrsfscript { rscale = 0.97 }, - presets.mathxitsarabic { rscale = 0.95 }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { rscale = 0.97 }, + presets.rsfsuprighttoscript { rscale = 0.97 }, + presets.moderntocalligraphic { rscale = 0.97 }, + presets.eulertocalligraphic { rscale = 0.97 }, + presets.xitsarabic { rscale = 0.95 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { factor = 1.5}, -- needs checking + presets.wipeitalics { }, { tweak = "simplifykerns", }, - presets.moveitalics { - correct = true - }, { tweak = "kerns", list = { @@ -237,48 +194,38 @@ return { bigslots = { 1, 2, 3, 4 }, - -- - -- experimental fixes for mkiv: - -- - dimensions = dimensions, - kerns = kerns, - kernpairs = kernpairs, }, } - --- Old - -- { - -- tweak = "dimensions", - -- list = { - - -- -- [0x00060] = { yoffset = -0.1 }, -- grave - -- -- [0x000B4] = { yoffset = -0.1 }, -- acute - -- -- [0x002C6] = { yoffset = -0.1 }, -- hat - -- -- [0x002DC] = { yoffset = -0.1 }, -- tilde - -- -- [0x000AF] = { yoffset = -0.1 }, -- bar - -- -- [0x002D8] = { yoffset = -0.15 }, -- breve - -- -- [0x002D9] = { yoffset = -0.15 }, -- dot - -- -- [0x000A8] = { yoffset = -0.1 }, -- ddot - -- -- [0x020DB] = { yoffset = -0.05 }, -- dddot - -- -- [0x002C7] = { yoffset = -0.1 }, -- check - -- -- [0x020D7] = { yoffset = -0.05 }, -- vec - - -- -- [0x00300] = { yoffset = -0.12, all=true }, -- widegrave - -- -- [0x00301] = { yoffset = -0.12, all=true }, -- wideacute - -- -- [0x00302] = { yoffset = -0.12, all=true }, -- widehat - -- -- [0x00303] = { yoffset = -0.12, all=true }, -- widetilde - -- -- [0x00304] = { yoffset = -0.12, all=true }, -- widebar - -- -- [0x00306] = { yoffset = -0.12, all=true }, -- widebreve - -- -- [0x00307] = { yoffset = -0.025, all=true }, -- widedot - -- -- [0x00308] = { yoffset = -0.025, all=true }, -- wideddot - -- -- [0x020DB] = { yoffset = -0.1, all=true }, -- widedddot - -- -- [0x0030A] = { yoffset = -0.12, all=true }, -- widering - -- -- [0x0030C] = { yoffset = -0.12, all=true }, -- widecheck - - -- [0x1D43D] = { xoffset = 0.25, width = 1.15, italic = 0.2 }, -- J - -- [0x1D487] = { anchor = 0.8 }, -- bold lower case italic f - -- -- [0x1D487] = { xoffset = 0, width = 1, italic = 0, anchor = 1.3 }, -- bold lower case italic f - - -- }, - -- }, +-- For now we keep these commented as they show where we came from. + +-- { +-- tweak = "dimensions", +-- list = { +-- -- [0x00060] = { yoffset = -0.1 }, -- grave +-- -- [0x000B4] = { yoffset = -0.1 }, -- acute +-- -- [0x002C6] = { yoffset = -0.1 }, -- hat +-- -- [0x002DC] = { yoffset = -0.1 }, -- tilde +-- -- [0x000AF] = { yoffset = -0.1 }, -- bar +-- -- [0x002D8] = { yoffset = -0.15 }, -- breve +-- -- [0x002D9] = { yoffset = -0.15 }, -- dot +-- -- [0x000A8] = { yoffset = -0.1 }, -- ddot +-- -- [0x020DB] = { yoffset = -0.05 }, -- dddot +-- -- [0x002C7] = { yoffset = -0.1 }, -- check +-- -- [0x020D7] = { yoffset = -0.05 }, -- vec +-- -- [0x00300] = { yoffset = -0.12, all=true }, -- widegrave +-- -- [0x00301] = { yoffset = -0.12, all=true }, -- wideacute +-- -- [0x00302] = { yoffset = -0.12, all=true }, -- widehat +-- -- [0x00303] = { yoffset = -0.12, all=true }, -- widetilde +-- -- [0x00304] = { yoffset = -0.12, all=true }, -- widebar +-- -- [0x00306] = { yoffset = -0.12, all=true }, -- widebreve +-- -- [0x00307] = { yoffset = -0.025, all=true }, -- widedot +-- -- [0x00308] = { yoffset = -0.025, all=true }, -- wideddot +-- -- [0x020DB] = { yoffset = -0.1, all=true }, -- widedddot +-- -- [0x0030A] = { yoffset = -0.12, all=true }, -- widering +-- -- [0x0030C] = { yoffset = -0.12, all=true }, -- widecheck +-- [0x1D43D] = { xoffset = 0.25, width = 1.15, italic = 0.2 }, -- J +-- [0x1D487] = { anchor = 0.8 }, -- bold lower case italic f +-- -- [0x1D487] = { xoffset = 0, width = 1, italic = 0, anchor = 1.3 }, -- bold lower case italic f +-- }, +-- }, diff --git a/tex/context/fonts/mkiv/common-math.lfg b/tex/context/fonts/mkiv/common-math.lfg index d97511e76..c2c690bf1 100644 --- a/tex/context/fonts/mkiv/common-math.lfg +++ b/tex/context/fonts/mkiv/common-math.lfg @@ -7,10 +7,51 @@ return { mathematics = { tweaks = { presets = { - matheulercalligraphic = function(parameters) + fallbacks = function(parameters) + return { + tweak = "fallbacks", + } + end, + scripttocalligraphic = function(parameters) + return { + tweak = "replacealphabets", + feature = "scripttocalligraphic", + list = { + { + source = "uppercasescript", + target = "uppercasecalligraphic", + }, + { + source = "uppercaseboldscript", + target = "uppercaseboldcalligraphic", + }, + }, + } + end, + moderntocalligraphic = function(parameters) + return { + tweak = "replacealphabets", + feature = "moderntocalligraphic", + list = { + { + source = "uppercasescript", + target = "uppercasecalligraphic", + filename = "latinmodern-math.otf", + rscale = parameters.rscale, + }, + { + source = "uppercaseboldscript", + target = "uppercaseboldcalligraphic", + filename = "latinmodern-math.otf", + rscale = parameters.rscale, + }, + }, + } + end, + eulertocalligraphic = function(parameters) return { tweak = "replacealphabets", - feature = "matheulercalligraphic", + feature = "eulertocalligraphic", list = { { source = "uppercasescript", @@ -27,10 +68,30 @@ return { }, } end, - mathrsfscript = function(parameters) + rsfstoscript = function(parameters) return { tweak = "replacealphabets", - feature = "mathrsfscript", + feature = "rsfstoscript", + list = { + { + source = "uppercasescript", + target = "uppercasescript", + filename = "ralphsmithsformalscript-companion.otf", + rscale = parameters.rscale, + }, + { + source = "uppercaseboldscript", + target = "uppercaseboldscript", + filename = "ralphsmithsformalscript-companion.otf", + rscale = parameters.rscale, + }, + }, + } + end, + rsfsuprighttoscript = function(parameters) + return { + tweak = "replacealphabets", + feature = "rsfsuprighttoscript", list = { { source = "uppercasescript", @@ -49,10 +110,10 @@ return { }, } end, - mathxitsarabic = function(parameters) + xitsarabic = function(parameters) return { tweak = "replacealphabets", - feature = "mathxitsarabic", + feature = "xitsarabic", list = { { source = "arabicmathematicalalphabeticsymbols", @@ -79,7 +140,8 @@ return { return { tweak = "moveitalics", correct = parameters.correct, - list = { + list = (parameters.all and "all") or (parameters.letters and "letters") or { + -- "lowercasenormal", "lowercaseitalic", "lowercasebold", @@ -88,6 +150,19 @@ return { "lowercasegreekitalic", "lowercasegreekbold", "lowercasegreekbolditalic", + "lowercaseboldfraktur", + "lowercaseboldscript", + "lowercasedoublestruck", + "lowercasefraktur", + "lowercasegreeksansserifbold", + "lowercasegreeksansserifbolditalic", + "lowercasemonospace", + "lowercasesansserifbold", + "lowercasesansserifbolditalic", + "lowercasesansserifitalic", + "lowercasesansserifnormal", + "lowercasescript", + -- "uppercasenormal", "uppercaseitalic", "uppercasebold", @@ -96,10 +171,95 @@ return { "uppercasegreekitalic", "uppercasegreekbold", "uppercasegreekbolditalic", + "uppercaseboldfraktur", + "uppercasebolditalic", + "uppercaseboldscript", + "uppercasedoublestruck", + "uppercasefraktur", + "uppercasegreeksansserifbold", + "uppercasegreeksansserifbolditalic", + "uppercasemonospace", + "uppercasesansserifbold", + "uppercasesansserifbolditalic", + "uppercasesansserifitalic", + "uppercasesansserifnormal", + "uppercasescript", + -- + "digitsbold", + "digitsdoublestruck", + "digitslatin", + "digitsmonospace", + "digitsnormal", + "digitssansserifbold", + "digitssansserifnormal", + -- + -- We don't do these (one can use all=true) because now we can get + -- more details about what gets italics. + -- + -- "latinextendeda", + -- "latinextendedadditional", + -- "latinextendedb", + -- "latinextendedc", + -- "latinextendedd", + -- "latinextendede", + -- "latinextendedf", + -- "latinextendedg", + -- "latinsupplement", + -- mathematics.tweaks.subsets.dotless, } } end, + moveintegrals = function(parameters) + return { + tweak = "movelimits", + factor = parameters.factor or 1, + list = mathematics.tweaks.subsets.integrals, + } + end, + wipeitalics = function(parameters) + return { + tweak = "wipeitalics", + all = true, + } + end, + wipeanchors = function(parameters) + return { + -- For upright alphabets, we unset the anchor. This means that accents are placed + -- centered over the character. Should be on top. + tweak = "wipeanchors", + list = { + "digitsbold", + "digitsdoublestruck", + "digitsmonospace", + "digitsnormal", + "digitssansserifbold", + "digitssansserifnormal", + "lowercasebold", + "lowercaseboldfraktur", + "lowercasedoublestruck", + "lowercasefraktur", + "lowercasegreekbold", + "lowercasegreeknormal", + "lowercasegreeksansserifbold", + "lowercasemonospace", + "lowercasenormal", + "lowercasesansserifbold", + "lowercasesansserifnormal", + "uppercasebold", + "uppercaseboldfraktur", + "uppercasedoublestruck", + "uppercasefraktur", + "uppercasegreekbold", + "uppercasegreeknormal", + "uppercasegreeksansserifbold", + "uppercasemonospace", + "uppercasenormal", + "uppercasesansserifbold", + "uppercasesansserifnormal", + }, + } + end, }, }, }, diff --git a/tex/context/fonts/mkiv/concrete-math.lfg b/tex/context/fonts/mkiv/concrete-math.lfg index fd2d5caad..68d686593 100644 --- a/tex/context/fonts/mkiv/concrete-math.lfg +++ b/tex/context/fonts/mkiv/concrete-math.lfg @@ -1,5 +1,3 @@ --- this file might go away and is for experiments only - local common = fonts.goodies.load("common-math.lfg") local presets = common.mathematics.tweaks.presets @@ -27,8 +25,16 @@ return { -- { -- tweak = "addmirrors", -- }, --- presets.matheulercalligraphic { rscale = 0.97 }, --- presets.mathrsfscript { rscale = 0.95 }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { }, + presets.rsfsuprighttoscript { }, + presets.moderntocalligraphic { }, + presets.eulertocalligraphic { }, + presets.xitsarabic { }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveintegrals { factor = 1.5 }, + presets.wipeitalics { }, { tweak = "kerns", list = { @@ -52,13 +58,17 @@ return { tweak = "setoptions", set = { "ignorekerndimensions" } }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, }, }, bigslots = { 1, 2, 3, 4 }, }, - } - diff --git a/tex/context/fonts/mkiv/dejavu-math.lfg b/tex/context/fonts/mkiv/dejavu-math.lfg index d18082b85..70eecb27e 100644 --- a/tex/context/fonts/mkiv/dejavu-math.lfg +++ b/tex/context/fonts/mkiv/dejavu-math.lfg @@ -1,21 +1,9 @@ -local dimensions, kerns if CONTEXTLMTXMODE == 0 then - - local kern_V = { bottomright = { { kern = -250 } } } - local kern_W = kern_W - - kerns = { - [0x1D449] = kern_V, -- 𝑉 - [0x1D44A] = kern_W, -- 𝑊 - } - -end +local common = fonts.goodies.load("common-math.lfg") +local presets = common.mathematics.tweaks.presets local integral_variants = { bottomright = -0.20 } local integral_bottom = { bottomright = -0.25 } -local common = fonts.goodies.load("common-math.lfg") -local presets = common.mathematics.tweaks.presets - return { name = "dejavu-math", version = "1.00", @@ -54,10 +42,17 @@ return { { tweak = "addmirrors", }, - presets.matheulercalligraphic { rscale = 1.02 }, - presets.mathrsfscript { rscale = 1.02 }, - presets.mathxitsarabic { rscale = 1.05 }, - presets.moveitalics { correct = true }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { rscale = 1.02 }, + presets.rsfsuprighttoscript { rscale = 1.02 }, + presets.moderntocalligraphic { rscale = 1.02 }, + presets.eulertocalligraphic { rscale = 1.02 }, + presets.xitsarabic { rscale = 1.05 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { factor = 1.5 }, -- we need to check this + presets.wipeitalics { }, { tweak = "kerns", list = { @@ -71,7 +66,7 @@ return { ["0x221A.parts.top"] = { topright = 0.2, }, -- right radical top ["0x221A.parts.bottom"] = { bottomright = 0.2 }, -- right radical bottom ["0x221A.variants.*"] = { topright = 0.2, bottomright = 0.2 }, -- right radical variants - [0x27E9] = { topright = -0.1, bottomright = -0.1 }, -- angle + [0x27E9] = { topright = -0.1, bottomright = -0.1 }, -- angle ["0x27E9.variants.*"] = { topright = -0.2, bottomright = -0.2 }, [0x27EB] = { topright = -0.1, bottomright = -0.1 }, ["0x27EB.variants.*"] = { topright = -0.2, bottomright = -0.2 }, @@ -167,6 +162,12 @@ return { tweak = "addfourier", variant = 1, }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, }, }, alternates = { @@ -183,15 +184,14 @@ return { }, } +-- For now we keep these commented as they show where we came from. - --- Old - -- { - -- tweak = "dimensions", - -- list = { - -- [0x1D44E] = { width = 1, italic = 0, anchor = 0.9 }, -- a - -- -- [0x1D449] = { width = .8, italic = .2 }, - -- -- [0x1D44A] = { width = .8, italic = .2 }, - -- ["0x1D449:0x1D44A"] = { width = .8, italic = .2 }, - -- } - -- }, +-- { +-- tweak = "dimensions", +-- list = { +-- [0x1D44E] = { width = 1, italic = 0, anchor = 0.9 }, -- a +-- -- [0x1D449] = { width = .8, italic = .2 }, +-- -- [0x1D44A] = { width = .8, italic = .2 }, +-- ["0x1D449:0x1D44A"] = { width = .8, italic = .2 }, +-- } +-- }, diff --git a/tex/context/fonts/mkiv/erewhon-math.lfg b/tex/context/fonts/mkiv/erewhon-math.lfg index fe8bb7108..e366ee12e 100644 --- a/tex/context/fonts/mkiv/erewhon-math.lfg +++ b/tex/context/fonts/mkiv/erewhon-math.lfg @@ -1,4 +1,5 @@ --- This file might go away and is for experiments only. +-- This font is under active development so we don't want to tweek it too much +-- before all issues are sorted out. local common = fonts.goodies.load("common-math.lfg") local presets = common.mathematics.tweaks.presets @@ -32,9 +33,17 @@ return { { tweak = "addmirrors", }, - presets.matheulercalligraphic { rscale = 0.93 }, - presets.mathrsfscript { rscale = 0.93 }, - presets.mathxitsarabic { rscale = 0.90 }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { }, + presets.rsfsuprighttoscript { }, + presets.moderntocalligraphic { }, + presets.eulertocalligraphic { }, + presets.xitsarabic { rscale = 0.90 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { factor = 1.5 }, + presets.wipeitalics { }, { tweak = "kerns", list = { @@ -76,6 +85,12 @@ return { tweak = "setoptions", set = { "ignorekerndimensions" } }, + -- this is the mkiv section +-- { +-- tweak = "emulatelmtx", +-- feature = "emulatelmtx", +-- comment = "this is for mkiv", +-- }, }, }, bigslots = { @@ -84,5 +99,3 @@ return { }, } - - diff --git a/tex/context/fonts/mkiv/euler-math.lfg b/tex/context/fonts/mkiv/euler-math.lfg index 9e5efa680..1c4659786 100644 --- a/tex/context/fonts/mkiv/euler-math.lfg +++ b/tex/context/fonts/mkiv/euler-math.lfg @@ -1,4 +1,5 @@ --- this file might go away and is for experiments only +local common = fonts.goodies.load("common-math.lfg") +local presets = common.mathematics.tweaks.presets return { name = "euler-math", @@ -8,26 +9,119 @@ return { copyright = "ConTeXt development team", mathematics = { parameters = { - DelimiterPercent = 901, - DelimiterShortfall = 500, + -- DelimiterPercent = 90, + -- DelimiterShortfall = 500, + -- taken from pagella: + NoLimitSupFactor = 0, + NoLimitSubFactor = 900, + AccentTopShiftUp = 10, + FlattenedAccentTopShiftUp = 10, + -- AccentExtendMargin = 50, + -- AccentBaseHeight = 0, + AccentBaseDepth = 80, + -- SpaceAfterScript = 0, + -- SpaceAfterScript = 30, + RadicalDegreeBottomRaisePercent = 60, + RadicalKernAfterDegree = -500, + RadicalRuleThickness = 60, -- 60 in font + DelimiterPercent = 90, + DelimiterShortfall = 400, + DisplayOperatorMinHeight = 1800, -- 1500 in font + PrimeRaisePercent = 75, -- 50 default + PrimeRaiseComposedPercent = 10, -- 25 default + -- RadicalKernAfterExtensible = 0, -- 0 default + -- RadicalKernBeforeExtensible = 0, -- 0 default + }, tweaks = { aftercopying = { + { + tweak = "version", + expected = "Version 000.002 ", + }, { tweak = "fixprimes", - factor = 0.9, + factor = 1.2, smaller = true, - scale = 0.60, - fake = 0.75, + scale = 0.80, + fake = 0.80, + }, + { + tweak = "replacealphabets", + feature = "pagellaovereuler", + filename = "texgyrepagella-math.otf", + list = { + -- { source = { first = 0x02100, last = 0x0210D } }, -- no 0x2210E + -- { source = { first = 0x0210F, last = 0x02BFF } }, + { source = { first = 0x02100, last = 0x02BFF } }, + { source = { first = 0x1D400, last = 0x1D7FF } }, + { source = { first = 0x1D538, last = 0x1D550 } }, + }, + }, + { + tweak = "addmirrors", + }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { }, + presets.rsfsuprighttoscript { }, + presets.moderntocalligraphic { }, + presets.eulertocalligraphic { }, + presets.xitsarabic { rscale = 1 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { }, + presets.wipeitalics { }, + { + tweak = "fixoldschool", + }, + -- add the accent fixes + -- fixslashes? + { + tweak = "checkspacing", + }, + { + tweak = "addscripts", + }, + { + tweak = "addprivates", + }, + { + tweak = "accentdimensions", + }, + { + tweak = "addrules", + }, + { + tweak = "addarrows", + }, + { + tweak = "addbars", + advance = 0.2, + }, + { + tweak = "addactuarian", + }, + { + tweak = "addequals", + }, + { + tweak = "addfourier", + variant = 1, + }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", }, }, }, bigslots = { 1, 3, 5, 7 }, + alternates = { + dotless = { feature = 'dtls', value = 1, comment = "Mathematical Dotless Forms" }, + }, }, - - } - - diff --git a/tex/context/fonts/mkiv/garamond-math.lfg b/tex/context/fonts/mkiv/garamond-math.lfg index a0a0700f5..9537f52b9 100644 --- a/tex/context/fonts/mkiv/garamond-math.lfg +++ b/tex/context/fonts/mkiv/garamond-math.lfg @@ -42,35 +42,31 @@ return { { tweak = "addmirrors", }, - presets.matheulercalligraphic { rscale = 0.95 }, - presets.mathrsfscript { rscale = 0.95 }, - presets.mathxitsarabic { rscale = 0.80 }, - { - tweak = "oldstylemath", - factor = 0, - }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { rscale = 0.95 }, + presets.rsfsuprighttoscript { rscale = 0.95 }, + presets.moderntocalligraphic { rscale = 0.95 }, + presets.eulertocalligraphic { rscale = 0.95 }, + presets.xitsarabic { rscale = 0.80 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { factor = 1.5 }, + presets.wipeitalics { }, { tweak = "simplifykerns", }, - presets.moveitalics { - correct = true - }, { tweak = "topanchors", list = { [0x1D453] = 0.88, -- italic f }, }, - { - tweak = "limits", - factor = 1.5, - list = mathematics.tweaks.subsets.integrals, - }, { tweak = "dimensions", list = { -- for older entries, see bottom of file - [0x1D453] = { width = 1.1, }, -- italic f + [0x1D453] = { width = 1.1 }, -- italic f }, }, { @@ -140,10 +136,10 @@ return { [mathematics.tweaks.subsets.f] = -.25, [0x1D70C] = -.25, -- italic \rho }, - -- "uppercaseitalic" = { - -- [mathematics.tweaks.subsets.f] = -.25, - -- [0x1D70C] = -.25, -- italic \rho - -- }, + -- ["uppercaseitalic"] = { + -- [mathematics.tweaks.subsets.f] = -.25, + -- [0x1D70C] = -.25, -- italic \rho + -- }, }, }, -- Accents are a mess. We migrate the extensibles from the combiners to the base accent @@ -160,10 +156,10 @@ return { { tweak = "dimensions", list = { - -- [0x00302] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widehat - -- [0x00303] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widetilde - -- [0x00306] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widebreve - -- [0x0030C] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widecheck + -- [0x00302] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widehat + -- [0x00303] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widetilde + -- [0x00306] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widebreve + -- [0x0030C] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widecheck }, }, -- Then we deal with all offsets and heights in one go. So we treat the initial accent @@ -192,39 +188,6 @@ return { { tweak = "copyaccents", }, - -- So far for the accents. - { - -- For non-italic alphabets we remove italic correction. - -- This one is/will become obsolete - -- tweak = "wipeitalics", - list = { - "digitsbold", - "digitsdoublestruck", - "digitsmonospace", - "digitsnormal", - "digitssansserifbold", - "digitssansserifnormal", - -- "lowercasebold", - "lowercaseboldfraktur", - "lowercasedoublestruck", - "lowercasefraktur", - "lowercasemonospace", - -- "lowercasenormal", - "lowercasesansserifbold", - -- "lowercasesansserifnormal", - -- "lowercasegreeknormal", - -- "uppercasebold", - "uppercaseboldfraktur", - "uppercasedoublestruck", - "uppercasefraktur", - "uppercasegreekbold", - "uppercasegreeknormal", - "uppercasegreeksansserifbold", - "uppercasemonospace", - "uppercasesansserifbold", - "uppercasesanserifnormal", -- some remain - }, - }, { tweak = "checkspacing", }, @@ -251,6 +214,12 @@ return { tweak = "addfourier", variant = 1, }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, { tweak = "diagnose", }, @@ -272,82 +241,78 @@ return { }, } +-- For now we keep these commented as they show where we came from. +-- { +-- tweak = "dimensions", +-- list = { +-- -- offset width italic +-- -- -- [0x00060] = { yoffset = -0.1 }, -- grave +-- -- -- [0x000B4] = { yoffset = -0.1 }, -- acute +-- -- [0x002C6] = { yoffset = -0.1 }, -- hat +-- -- [0x002DC] = { yoffset = -0.1 }, -- tilde +-- -- -- [0x000AF] = { yoffset = -0.1 }, -- bar +-- -- [0x002D8] = { yoffset = -0.15 }, -- breve +-- -- [0x002D9] = { yoffset = -0.15 }, -- dot +-- -- -- [0x000A8] = { yoffset = -0.1 }, -- ddot +-- -- [0x020DB] = { yoffset = -0.115 }, -- dddot +-- -- [0x002C7] = { yoffset = -0.1 }, -- check +-- -- [0x020D7] = { yoffset = -0.1 }, -- vec +-- -- [0x00300] = { yoffset = -0.12 , all = true }, -- widegrave +-- -- [0x00301] = { yoffset = -0.12 , all = true }, -- wideacute +-- -- [0x00302] = { yoffset = -0.12 , all = true }, -- widehat +-- -- [0x00303] = { yoffset = -0.12 , all = true }, -- widetilde +-- -- [0x00304] = { yoffset = -0.12 , all = true }, -- widebar +-- -- [0x00306] = { yoffset = -0.12 , all = true }, -- widebreve +-- -- [0x00307] = { yoffset = -0.12 , all = true }, -- widedot +-- -- [0x00308] = { yoffset = -0.12 , all = true }, -- wideddot +-- -- -- [0x020DB] = { yoffset = -0.1 , all = true }, -- widedddot +-- -- [0x0030A] = { yoffset = -0.12 , all = true }, -- widering +-- -- [0x0030C] = { yoffset = -0.12 , all = true }, -- widecheck --- Some old entries: - - -- { - -- tweak = "dimensions", - -- list = { - -- -- offset width italic - -- -- -- [0x00060] = { yoffset = -0.1 }, -- grave - -- -- -- [0x000B4] = { yoffset = -0.1 }, -- acute - -- -- [0x002C6] = { yoffset = -0.1 }, -- hat - -- -- [0x002DC] = { yoffset = -0.1 }, -- tilde - -- -- -- [0x000AF] = { yoffset = -0.1 }, -- bar - -- -- [0x002D8] = { yoffset = -0.15 }, -- breve - -- -- [0x002D9] = { yoffset = -0.15 }, -- dot - -- -- -- [0x000A8] = { yoffset = -0.1 }, -- ddot - -- -- [0x020DB] = { yoffset = -0.115 }, -- dddot - -- -- [0x002C7] = { yoffset = -0.1 }, -- check - -- -- [0x020D7] = { yoffset = -0.1 }, -- vec - - -- -- [0x00300] = { yoffset = -0.12 , all = true }, -- widegrave - -- -- [0x00301] = { yoffset = -0.12 , all = true }, -- wideacute - -- -- [0x00302] = { yoffset = -0.12 , all = true }, -- widehat - -- -- [0x00303] = { yoffset = -0.12 , all = true }, -- widetilde - -- -- [0x00304] = { yoffset = -0.12 , all = true }, -- widebar - -- -- [0x00306] = { yoffset = -0.12 , all = true }, -- widebreve - -- -- [0x00307] = { yoffset = -0.12 , all = true }, -- widedot - -- -- [0x00308] = { yoffset = -0.12 , all = true }, -- wideddot - -- -- -- [0x020DB] = { yoffset = -0.1 , all = true }, -- widedddot - -- -- [0x0030A] = { yoffset = -0.12 , all = true }, -- widering - -- -- [0x0030C] = { yoffset = -0.12 , all = true }, -- widecheck - - -- -- [0x002C6] = { scale =.85, yoffset = .1, width = .85, height = .935 }, -- hat - - -- [0x00393] = { xoffset = 0.05, width = 1.05, italic = 0.075 }, -- \Gamma - -- -- [0x003A6] = { xoffset = 0.05, width = 1.05, italic = 0 }, -- \Phi difficult! - -- [0x003A8] = { xoffset = 0.05, width = 1.05, italic = 0.075 }, -- \Psi - -- [0x02113] = { width = 1, italic = 0.075 }, -- \ell - -- [0x1D436] = { width = 1, italic = 0.05 }, -- C - -- [0x1D43D] = { xoffset = 0.3, width = 1.4, italic = 0.1 }, -- J - -- [0x1D44B] = { width = 1, italic = 0.05 }, -- X - -- [0x1D44F] = { width = 1, italic = 0, }, -- b - -- [0x1D450] = { width = 1.1, italic = 0 }, -- c - -- [0x1D451] = { width = 1, italic = 0.05, }, -- d - -- [0x1D452] = { width = 1.1, italic = 0.05 }, -- e - -- [0x00066] = { width = 1.4, italic = 0.0, }, -- f - -- [0x1D453] = { xoffset = 0.15, width = 1.15, italic = 0.1, }, -- f - -- [0x1D454] = { xoffset = 0.1, width = 1.2, italic = 0.1 }, -- g - -- [0x0210E] = { width = 1.1, italic = 0, }, -- h - -- [0x1D457] = { xoffset = 0.2, width = 1.25, italic = 0.05 }, -- j - -- [0x1D458] = { width = 1, italic = 0, }, -- k - -- [0x1D459] = { width = 1, italic = 0.05 }, -- l - -- [0x1D45D] = { xoffset = 0.15, width = 1.15, italic = 0, }, -- p - -- [0x1D45E] = { width = 1.05, italic = 0 }, -- q - -- [0x1D45F] = { width = 1.05, italic = 0 }, -- r - -- [0x1D461] = { width = 1, italic = 0.1 }, -- t - -- [0x1D465] = { xoffset = 0.05, width = 1.1, italic = 0.05 }, -- x - -- [0x1D466] = { xoffset = 0.2, width = 1.2, italic = 0, }, -- y - -- [0x1D6FD] = { xoffset = 0.05, width = 1.1, italic = 0.05 }, -- \beta - -- [0x1D6FE] = { width = 1.05, italic = 0 }, -- \gamma - -- [0x1D6FF] = { width = 1, italic = 0.1 }, -- \delta - -- [0x1D716] = { width = 1.1, italic = 0 }, -- \epsilon - -- [0x1D700] = { width = 1.1, italic = 0 }, -- \varepsilon - -- [0x1D701] = { width = 1, italic = 0.15 }, -- \zeta - -- [0x1D703] = { width = 1, italic = 0.1 }, -- \theta - -- [0x1D705] = { width = 1, italic = 0.1 }, -- \kappa - -- [0x1D706] = { xoffset = 0.05, width = 1.1, italic = 0 }, -- \lambda - -- [0x1D707] = { xoffset = 0.05, width = 1.05, italic = 0 }, -- \mu - -- [0x1D708] = { width = 1.1, italic = 0 }, -- \nu - -- [0x1D709] = { width = 1.1, italic = 0 }, -- \xi - -- [0x1D70B] = { width = 1.05, italic = 0 }, -- \pi - -- [0x1D70C] = { xoffset = 0.2, width = 1.2, italic = 0 }, -- \rho - -- [0x1D70E] = { width = 1, italic = 0.1 }, -- \sigma - -- [0x1D70F] = { xoffset = 0.05, width = 1.05, italic = 0.1 }, -- \tau - -- [0x1D712] = { xoffset = 0.15, width = 1.2, italic = 0.05 }, -- \chi - -- [0x1D713] = { xoffset = 0.05, width = 1.05, italic = 0.05 }, -- \psi - -- }, - -- }, +-- -- [0x002C6] = { scale =.85, yoffset = .1, width = .85, height = .935 }, -- hat +-- [0x00393] = { xoffset = 0.05, width = 1.05, italic = 0.075 }, -- \Gamma +-- -- [0x003A6] = { xoffset = 0.05, width = 1.05, italic = 0 }, -- \Phi difficult! +-- [0x003A8] = { xoffset = 0.05, width = 1.05, italic = 0.075 }, -- \Psi +-- [0x02113] = { width = 1, italic = 0.075 }, -- \ell +-- [0x1D436] = { width = 1, italic = 0.05 }, -- C +-- [0x1D43D] = { xoffset = 0.3, width = 1.4, italic = 0.1 }, -- J +-- [0x1D44B] = { width = 1, italic = 0.05 }, -- X +-- [0x1D44F] = { width = 1, italic = 0, }, -- b +-- [0x1D450] = { width = 1.1, italic = 0 }, -- c +-- [0x1D451] = { width = 1, italic = 0.05, }, -- d +-- [0x1D452] = { width = 1.1, italic = 0.05 }, -- e +-- [0x00066] = { width = 1.4, italic = 0.0, }, -- f +-- [0x1D453] = { xoffset = 0.15, width = 1.15, italic = 0.1, }, -- f +-- [0x1D454] = { xoffset = 0.1, width = 1.2, italic = 0.1 }, -- g +-- [0x0210E] = { width = 1.1, italic = 0, }, -- h +-- [0x1D457] = { xoffset = 0.2, width = 1.25, italic = 0.05 }, -- j +-- [0x1D458] = { width = 1, italic = 0, }, -- k +-- [0x1D459] = { width = 1, italic = 0.05 }, -- l +-- [0x1D45D] = { xoffset = 0.15, width = 1.15, italic = 0, }, -- p +-- [0x1D45E] = { width = 1.05, italic = 0 }, -- q +-- [0x1D45F] = { width = 1.05, italic = 0 }, -- r +-- [0x1D461] = { width = 1, italic = 0.1 }, -- t +-- [0x1D465] = { xoffset = 0.05, width = 1.1, italic = 0.05 }, -- x +-- [0x1D466] = { xoffset = 0.2, width = 1.2, italic = 0, }, -- y +-- [0x1D6FD] = { xoffset = 0.05, width = 1.1, italic = 0.05 }, -- \beta +-- [0x1D6FE] = { width = 1.05, italic = 0 }, -- \gamma +-- [0x1D6FF] = { width = 1, italic = 0.1 }, -- \delta +-- [0x1D716] = { width = 1.1, italic = 0 }, -- \epsilon +-- [0x1D700] = { width = 1.1, italic = 0 }, -- \varepsilon +-- [0x1D701] = { width = 1, italic = 0.15 }, -- \zeta +-- [0x1D703] = { width = 1, italic = 0.1 }, -- \theta +-- [0x1D705] = { width = 1, italic = 0.1 }, -- \kappa +-- [0x1D706] = { xoffset = 0.05, width = 1.1, italic = 0 }, -- \lambda +-- [0x1D707] = { xoffset = 0.05, width = 1.05, italic = 0 }, -- \mu +-- [0x1D708] = { width = 1.1, italic = 0 }, -- \nu +-- [0x1D709] = { width = 1.1, italic = 0 }, -- \xi +-- [0x1D70B] = { width = 1.05, italic = 0 }, -- \pi +-- [0x1D70C] = { xoffset = 0.2, width = 1.2, italic = 0 }, -- \rho +-- [0x1D70E] = { width = 1, italic = 0.1 }, -- \sigma +-- [0x1D70F] = { xoffset = 0.05, width = 1.05, italic = 0.1 }, -- \tau +-- [0x1D712] = { xoffset = 0.15, width = 1.2, italic = 0.05 }, -- \chi +-- [0x1D713] = { xoffset = 0.05, width = 1.05, italic = 0.05 }, -- \psi +-- }, +-- }, diff --git a/tex/context/fonts/mkiv/generic-math.lfg b/tex/context/fonts/mkiv/generic-math.lfg index 214e479e0..2a55504da 100644 --- a/tex/context/fonts/mkiv/generic-math.lfg +++ b/tex/context/fonts/mkiv/generic-math.lfg @@ -36,7 +36,24 @@ return { -- whatever }, }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { rscale = 1 }, + presets.rsfsuprighttoscript { rscale = 1 }, + presets.moderntocalligraphic { rscale = 1 }, + presets.eulertocalligraphic { rscale = 1 }, + presets.xitsarabic { rscale = 1 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { factor = 1.5 }, -- we need to check the 1.5 + presets.wipeanchors { }, + presets.wipeitalics { }, { + tweak = "simplifykerns", + }, + presets.moveitalics { + correct = true + }, { tweak = "fixprimes", factor = 0.85, -- accent base height smaller = true, -- replace multiples @@ -101,7 +118,7 @@ return { -- [0x21CB] = false, -- [0x21CC] = false, } - }, + }, -- { -- tweak = "limits", -- factor = 1.5, @@ -201,7 +218,7 @@ return { tweak = "margins", list = { }, - }, + }, -- { -- tweak = "fixanchors", -- factor = .5, @@ -222,6 +239,12 @@ return { { tweak = "wipecues", }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, }, }, bigslots = { diff --git a/tex/context/fonts/mkiv/kpfonts-math.lfg b/tex/context/fonts/mkiv/kpfonts-math.lfg index ed50baf3b..a4eff599f 100644 --- a/tex/context/fonts/mkiv/kpfonts-math.lfg +++ b/tex/context/fonts/mkiv/kpfonts-math.lfg @@ -1,3 +1,6 @@ +-- This font is under active development so we don't want to tweek it too much +-- before all issues are sorted out. + local common = fonts.goodies.load("common-math.lfg") local presets = common.mathematics.tweaks.presets @@ -82,9 +85,17 @@ return { }, }, }, - presets.matheulercalligraphic { rscale = 0.95 }, - presets.mathrsfscript { rscale = 0.95 }, - presets.mathxitsarabic { rscale = 0.92 }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { rscale = 0.95 }, + presets.rsfsuprighttoscript { rscale = 0.95 }, + presets.moderntocalligraphic { rscale = 0.95 }, + presets.eulertocalligraphic { rscale = 0.95 }, + presets.xitsarabic { rscale = 0.92 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { factor = 1.4 }, + presets.wipeitalics { }, { tweak = "checkspacing", }, @@ -112,6 +123,12 @@ return { tweak = "setoptions", set = { "ignorekerndimensions" } }, + -- this is the mkiv section +-- { +-- tweak = "emulatelmtx", +-- feature = "emulatelmtx", +-- comment = "this is for mkiv", +-- }, }, }, alternates = { diff --git a/tex/context/fonts/mkiv/libertinus-math.lfg b/tex/context/fonts/mkiv/libertinus-math.lfg index ea6a27cad..5a1cbd088 100644 --- a/tex/context/fonts/mkiv/libertinus-math.lfg +++ b/tex/context/fonts/mkiv/libertinus-math.lfg @@ -47,37 +47,20 @@ return { { tweak = "addmirrors", }, - presets.matheulercalligraphic { rscale = 0.92 }, - presets.mathrsfscript { rscale = 0.92 }, - presets.mathxitsarabic { rscale = 0.85 }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { rscale = 0.97 }, + presets.rsfsuprighttoscript { rscale = 0.97 }, + presets.moderntocalligraphic { rscale = 0.97 }, + presets.eulertocalligraphic { rscale = 0.97 }, + presets.xitsarabic { rscale = 0.85 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { factor = 1.5 }, + presets.wipeitalics { }, { tweak = "simplifykerns", }, - { - -- When it makes sense we get rid of italics. - tweak = "moveitalics", - correct = true, - list = { - "lowercasenormal", - "lowercaseitalic", - "lowercasebold", - "lowercasebolditalic", - "lowercasegreeknormal", - "lowercasegreekitalic", - "lowercasegreekbold", - "lowercasegreekbolditalic", - "uppercasenormal", - "uppercaseitalic", - "uppercasebold", - "uppercasebolditalic", - "uppercasegreeknormal", - "uppercasegreekitalic", - "uppercasegreekbold", - "uppercasegreekbolditalic", - mathematics.tweaks.subsets.dotless, - } - }, - { tweak = "kerns", list = { @@ -179,6 +162,12 @@ return { tweak = "setoptions", set = { "ignorekerndimensions" } }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, }, }, bigslots = { @@ -187,39 +176,39 @@ return { }, } --- Old values - -- { - -- tweak = "dimensions", - -- list = { - -- -- [0x00060] = { yoffset = -0.075 }, -- grave - -- -- [0x000B4] = { yoffset = -0.075 }, -- acute - -- -- [0x002C6] = { yoffset = -0.075 }, -- hat - -- -- [0x002DC] = { yoffset = -0.075 }, -- tilde - -- -- [0x000AF] = { yoffset = -0.1 }, -- bar - -- -- [0x002D8] = { yoffset = -0.075 }, -- breve - -- -- [0x002D9] = { yoffset = -0.05 }, -- dot - -- -- [0x000A8] = { yoffset = -0.02 }, -- ddot - -- -- [0x020DB] = { yoffset = -0.02 }, -- dddot - -- -- [0x002DA] = { yoffset = -0.1 }, -- ring - -- -- [0x002C7] = { yoffset = -0.1 }, -- check - -- -- [0x020D7] = { yoffset = -0.1 }, -- vec +-- For now we keep these commented as they show where we came from. - -- -- [0x00300] = { yoffset = -0.1, all = true }, -- widegrave - -- -- [0x00301] = { yoffset = -0.1, all = true }, -- wideacute - -- -- [0x00302] = { yoffset = -0.1, all = true }, -- widehat - -- -- [0x00303] = { yoffset = -0.09, all = true }, -- widetilde - -- -- [0x00304] = { yoffset = -0.12, all = true }, -- widebar - -- -- [0x00306] = { yoffset = -0.05, all = true }, -- widebreve - -- -- [0x00307] = { yoffset = -0.02, all = true }, -- widedot - -- -- [0x00308] = { yoffset = -0.02, all = true }, -- wideddot - -- -- [0x020DB] = { yoffset = -0.1, all = true }, -- widedddot - -- -- [0x0030A] = { yoffset = -0.12, all = true }, -- widering - -- -- [0x0030C] = { yoffset = -0.04, all = true }, -- widecheck +-- { +-- tweak = "dimensions", +-- list = { +-- -- [0x00060] = { yoffset = -0.075 }, -- grave +-- -- [0x000B4] = { yoffset = -0.075 }, -- acute +-- -- [0x002C6] = { yoffset = -0.075 }, -- hat +-- -- [0x002DC] = { yoffset = -0.075 }, -- tilde +-- -- [0x000AF] = { yoffset = -0.1 }, -- bar +-- -- [0x002D8] = { yoffset = -0.075 }, -- breve +-- -- [0x002D9] = { yoffset = -0.05 }, -- dot +-- -- [0x000A8] = { yoffset = -0.02 }, -- ddot +-- -- [0x020DB] = { yoffset = -0.02 }, -- dddot +-- -- [0x002DA] = { yoffset = -0.1 }, -- ring +-- -- [0x002C7] = { yoffset = -0.1 }, -- check +-- -- [0x020D7] = { yoffset = -0.1 }, -- vec - -- -- [0x1D44F] = { width = 1, italic = 0, anchor = 1.5 }, -- b (6.8) - -- -- [0x1D451] = { width = 1, italic = 0, anchor = 1.2 }, -- d (6.8) - -- -- [0x0210E] = { width = 1, italic = 0, anchor = 1.5 }, -- h (6.8) - -- -- [0x1D458] = { width = 1, italic = 0, anchor = 1.5 }, -- k (6.8) - -- }, - -- }, +-- -- [0x00300] = { yoffset = -0.1, all = true }, -- widegrave +-- -- [0x00301] = { yoffset = -0.1, all = true }, -- wideacute +-- -- [0x00302] = { yoffset = -0.1, all = true }, -- widehat +-- -- [0x00303] = { yoffset = -0.09, all = true }, -- widetilde +-- -- [0x00304] = { yoffset = -0.12, all = true }, -- widebar +-- -- [0x00306] = { yoffset = -0.05, all = true }, -- widebreve +-- -- [0x00307] = { yoffset = -0.02, all = true }, -- widedot +-- -- [0x00308] = { yoffset = -0.02, all = true }, -- wideddot +-- -- [0x020DB] = { yoffset = -0.1, all = true }, -- widedddot +-- -- [0x0030A] = { yoffset = -0.12, all = true }, -- widering +-- -- [0x0030C] = { yoffset = -0.04, all = true }, -- widecheck +-- -- [0x1D44F] = { width = 1, italic = 0, anchor = 1.5 }, -- b (6.8) +-- -- [0x1D451] = { width = 1, italic = 0, anchor = 1.2 }, -- d (6.8) +-- -- [0x0210E] = { width = 1, italic = 0, anchor = 1.5 }, -- h (6.8) +-- -- [0x1D458] = { width = 1, italic = 0, anchor = 1.5 }, -- k (6.8) +-- }, +-- }, diff --git a/tex/context/fonts/mkiv/lm.lfg b/tex/context/fonts/mkiv/lm.lfg index 355b583d1..984038d58 100644 --- a/tex/context/fonts/mkiv/lm.lfg +++ b/tex/context/fonts/mkiv/lm.lfg @@ -4,59 +4,6 @@ local common = fonts.goodies.load("common-math.lfg") local presets = common.mathematics.tweaks.presets -local dimensions, kerns if CONTEXTLMTXMODE == 0 then - - local kern_150 = { bottomright = { { kern = -150 } } } - local kern_200 = { bottomright = { { kern = -200 } } } - - kerns = { - [0x1D449] = kern_150, -- - [0x1D44A] = kern_200, -- 𝑊 - - [0x1D4AB] = { - -- topleft = { { kern = -200 } }, - bottomright = { { kern = -200 } }, - }, - } - - dimensions = { - -- always applied - -- default = { - -- }, - -- driven by 'mathdimensions' feature - default = { - -- the root is quite displaced - [0x221A] = { - -- 73, -960, 853, 40 - yoffset = 960 - 40, - height = 960, - depth = 40, - }, - - -- [0xFE932] = { xoffset = 50, width = 290 }, -- used prime - -- [0x2032] = { xoffset = 50, width = 290 }, -- prime - }, - -- -- seems ok now -- - -- signs = { - -- -- [0x00B1] = { -- ± - -- -- height = 500, depth = 0, - -- -- }, - -- -- [0x2213] = { -- ∓ - -- -- height = 500, depth = 0, - -- -- }, - -- -- move in boundingbox - -- [0x00B1] = { -- ± - -- yoffset = 100, - -- }, - -- [0x2213] = { -- ∓ - -- yoffset = -100, - -- }, - -- }, - } - -end - - return { name = "latin modern", version = "1.00", @@ -70,7 +17,7 @@ return { NoLimitSubFactor = 900, AccentTopShiftUp = -60, FlattenedAccentTopShiftUp = -60, - -- AccentExtendMargin = 50, + -- AccentExtendMargin = 50, -- AccentBaseHeight = 0, -- AccentBaseDepth = 0, -- AccentTopOvershoot = 66, @@ -81,12 +28,12 @@ return { -- DisplayOperatorMinHeight = 1800, -- 1300 in font (only one) PrimeRaisePercent = 60, PrimeRaiseComposedPercent = 15, - -- SubSuperscriptGapMin = 160, -- 160 in font + -- SubSuperscriptGapMin = 160, -- 160 in font SuperscriptBaselineDropMax = 250, -- 250 in font - -- SuperscriptBottomMaxWithSubscript = 344, -- 344 in font - -- SuperscriptBottomMin = 108, -- 108 in font + -- SuperscriptBottomMaxWithSubscript = 344, -- 344 in font + -- SuperscriptBottomMin = 108, -- 108 in font SuperscriptShiftUp = 363, -- 363 in font - SuperscriptShiftUpCramped = 89, -- 289 in font + SuperscriptShiftUpCramped = 89, -- 289 in font }, tweaks = { aftercopying = { @@ -97,68 +44,22 @@ return { { tweak = "addmirrors", }, - presets.matheulercalligraphic { rscale = 1 }, - presets.mathrsfscript { rscale = 1 }, - presets.mathxitsarabic { rscale = 0.88 }, - presets.moveitalics { correct = true }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { }, + presets.rsfsuprighttoscript { }, + presets.moderntocalligraphic { }, + presets.eulertocalligraphic { }, + presets.xitsarabic { rscale = 0.80 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { factor = 1.4 }, + presets.wipeanchors { }, + presets.wipeitalics { }, + -- these will become moveanchors { tweak = "dimensions", list = { - -- [0x00060] = { yoffset = -0.05 }, -- grave - -- [0x000B4] = { yoffset = -0.05 }, -- acute - -- [0x002C6] = { yoffset = -0.05 }, -- hat - -- [0x002DC] = { yoffset = -0.05 }, -- tilde - -- [0x000AF] = { yoffset = -0.075 }, -- bar - -- [0x002D8] = { yoffset = -0.05 }, -- breve - -- [0x002D9] = { yoffset = -0.05 }, -- dot - -- [0x000A8] = { yoffset = -0.05 }, -- ddot - -- [0x020DB] = { yoffset = 0.2 }, -- dddot (done below!) - -- [0x002DA] = { width = 0 }, -- ring (bounding box is wrong) - -- [0x002C7] = { yoffset = -0.05 }, -- check - -- [0x020D7] = { yoffset = -0.05 }, -- vec - - -- [0x00300] = { yoffset = -0.03, all = true }, -- widegrave - -- [0x00301] = { yoffset = -0.03, all = true }, -- wideacute - -- [0x00302] = { yoffset = -0.075, all = true }, -- widehat - -- [0x00303] = { yoffset = -0.05, all = true }, -- widetilde - -- [0x00304] = { yoffset = -0.02, all = true }, -- widebar - -- [0x00306] = { yoffset = -0.05, all = true }, -- widebreve - -- [0x00307] = { yoffset = -0.027, all = true }, -- widedot - -- [0x00308] = { yoffset = -0.027, all = true }, -- wideddot - -- [0x020DB] = { yoffset = -0.065, all = true }, -- widedddot - -- [0x0030C] = { yoffset = -0.05, all = true }, -- widecheck - -- [0x0030A] = { yoffset = -0.025, all = true }, -- widering - - -- [0x0212C] = { width = 0.95, italic = 0.05 }, -- script B - -- [0x1D49E] = { width = 0.8, italic = 0.25 }, -- script C - -- [0x1D49F] = { width = 0.9, italic = 0.11 }, -- script D - -- [0x02130] = { width = 0.85, italic = 0.18 }, -- script E - -- [0x02131] = { width = 0.75, italic = 0.3 }, -- script F - -- [0x1D4A2] = { width = 0.9, italic = 0.11 }, -- script G - -- [0x0210B] = { width = 0.85, italic = 0.18 }, -- script H - -- [0x02110] = { width = 0.8, italic = 0.25 }, -- script I - -- [0x1D4A5] = { width = 0.8, italic = 0.25 }, -- script J - -- [0x1D4A6] = { width = 0.9, italic = 0.11 }, -- script K - -- [0x02112] = { width = 0.95, italic = 0.05 }, -- script L - -- [0x02133] = { width = 0.9, italic = 0.11 }, -- script M - -- [0x1D4A9] = { width = 0.85, italic = 0.18 }, -- script N - -- [0x1D4AA] = { width = 0.95, italic = 0.05 }, -- script O - -- [0x1D4AB] = { width = 0.8, italic = 0.25 }, -- script P - -- [0x1D4AB] = { width = 0.95, italic = 0.05 }, -- script Q - -- [0x0211B] = { width = 0.95, italic = 0.05 }, -- script R - -- [0x1D4AE] = { width = 0.9, italic = 0.11 }, -- script S - -- [0x1D4AF] = { width = 0.75, italic = 0.33 }, -- script T - -- [0x1D4B0] = { width = 0.9, italic = 0.11 }, -- script U - -- [0x1D4B1] = { width = 0.8, italic = 0.25 }, -- script V - -- [0x1D4B2] = { width = 0.8, italic = 0.25 }, -- script W - -- [0x1D4B3] = { width = 0.9, italic = 0.11 }, -- script X - -- [0x1D4B4] = { width = 0.85, italic = 0.18 }, -- script Y - -- [0x1D4B5] = { width = 0.95, italic = 0.05 }, -- script Z - - -- Setting anchors to shift the location of accents - -- Note: Many non-italic alphabets are wiped below - -- Todo: Check the less common italic alphabets - -- [0x1D483] = { anchor = 1.15 }, -- bold italic b -- [0x1D485] = { anchor = 0.8 }, -- bold italic d [0x1D487] = { anchor = 0.9 }, -- bold italic f @@ -290,13 +191,13 @@ return { { tweak = "dimensions", list = { - -- [0x00300] = { width = 0.8 }, -- widegrave - -- [0x00301] = { width = 0.9 }, -- wideacute + -- [0x00300] = { width = 0.8 }, -- widegrave + -- [0x00301] = { width = 0.9 }, -- wideacute [0x00302] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widehat [0x00303] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widetilde [0x00306] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widebreve - -- [0x0030A] = { width = 0.9, xoffset = -.0 }, -- widering - [0x0030C] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widecheck + -- [0x0030A] = { width = 0.9, xoffset = -.0 }, -- widering + [0x0030C] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widecheck }, }, -- Then we deal with all offsets and heights in one go. So we treat the initial accent @@ -305,19 +206,17 @@ return { tweak = "dimensions", list = { -- here we want to apply to all - -- [0x00300] = { yoffset = -0.02, height = .95, all = true }, -- widegrave : 0x0060 - -- [0x00301] = { yoffset = -0.02, height = .95, all = true }, -- wideacute : 0x00B4 - -- [0x00302] = { yoffset = -0.03, height = .95, all = true }, -- widehat : 0x02C6 - -- [0x00303] = { yoffset = -0.02, height = .95, all = true }, -- widetilde : 0x02DC - -- [0x00306] = { yoffset = -0.03, height = .95, all = true }, -- widebre : 0x02D8 - -- [0x0030A] = { yoffset = 0.00, height = .95, all = true }, -- widering : 0x02DA - -- [0x0030C] = { yoffset = -0.03, height = .95, all = true }, -- widecheck : 0x02C7 - - -- [0x00304] = { yoffset = -0.05, height = .95, all = true }, -- widebar : 0x00AF - - -- [0x00307] = { yoffset = -0.03, height = .95, all = true }, -- widedot : 0x02D9 - -- [0x00308] = { yoffset = -0.03, height = .95, all = true }, -- wideddot : 0x00A8 - [0x020DB] = { yoffset = -0.015, height = .95, all = true }, -- widedddot : 0x20DB (self) + -- [0x00300] = { yoffset = -0.02, height = .95, all = true }, -- widegrave : 0x0060 + -- [0x00301] = { yoffset = -0.02, height = .95, all = true }, -- wideacute : 0x00B4 + -- [0x00302] = { yoffset = -0.03, height = .95, all = true }, -- widehat : 0x02C6 + -- [0x00303] = { yoffset = -0.02, height = .95, all = true }, -- widetilde : 0x02DC + -- [0x00306] = { yoffset = -0.03, height = .95, all = true }, -- widebre : 0x02D8 + -- [0x0030A] = { yoffset = 0.00, height = .95, all = true }, -- widering : 0x02DA + -- [0x0030C] = { yoffset = -0.03, height = .95, all = true }, -- widecheck : 0x02C7 + -- [0x00304] = { yoffset = -0.05, height = .95, all = true }, -- widebar : 0x00AF + -- [0x00307] = { yoffset = -0.03, height = .95, all = true }, -- widedot : 0x02D9 + -- [0x00308] = { yoffset = -0.03, height = .95, all = true }, -- wideddot : 0x00A8 + [0x020DB] = { yoffset = -0.015, height = .95, all = true }, -- widedddot : 0x20DB (self) }, }, -- We now copy these to the not wide slots so that we can set these to stretch as well, @@ -333,12 +232,8 @@ return { -- to have the 2 in x^2/5 a bit over the slash tweak = "kerns", list = { - [0x2F] = { - topleft = -0.2, - -- bottomleft = 0, - -- topright = 0, - bottomright = -0.2, - }, -- solidus + [0x0002F] = { topleft = -0.2, bottomright = -0.2 }, -- solidus + -- [0x1D49C] = { bottomright = -0.05, }, -- script A [0x1D49D] = { bottomright = -0.05, }, -- script B [0x1D49E] = { bottomright = -0.25, }, -- script C @@ -365,43 +260,20 @@ return { [0x1D4B3] = { bottomright = -0.11, }, -- script X [0x1D4B4] = { bottomright = -0.18, }, -- script Y [0x1D4B5] = { bottomright = -0.05, }, -- script Z - - ["0x7D.parts.top"] = { - topright = -0.25, - }, -- right brace top - ["0x7D.parts.bottom"] = { - bottomright = -0.25, - }, -- right brace bottom - ["0x7D.variants.*"] = { - topright = -0.25, - bottomright = -0.25, - }, -- right brace variants - ["0x29.parts.top"] = { - topright = -0.3, - }, -- right parenthesis top - ["0x29.parts.bottom"] = { - bottomright = -0.3, - }, -- right parenthesis bottom - ["0x29.variants.*"] = { - topright = -0.25, - bottomright = -0.25, - }, -- right parenthesis variants - ["0x221A.parts.top"] = { - topright = 0.2, - }, -- right radical top - ["0x221A.parts.bottom"] = { - bottomright = 0.2, - }, -- right radical bottom - ["0x221A.variants.*"] = { - topright = 0.2, - bottomright = 0.2, - }, -- right radical variants - - -- angle - [0x27E9] = { topright = -0.2, bottomright = -0.2 }, - ["0x27E9.variants.*"] = { topright = -0.3, bottomright = -0.3 }, - [0x27EB] = { topright = -0.2, bottomright = -0.2 }, - ["0x27EB.variants.*"] = { topright = -0.3, bottomright = -0.3 }, + -- + ["0x7D.parts.top"] = { topright = -0.25 }, -- right brace top + ["0x7D.parts.bottom"] = { bottomright = -0.25 }, -- right brace bottom + ["0x7D.variants.*"] = { topright = -0.25, bottomright = -0.25 }, -- right brace variants + ["0x29.parts.top"] = { topright = -0.3, }, -- right parenthesis top + ["0x29.parts.bottom"] = { bottomright = -0.3 }, -- right parenthesis bottom + ["0x29.variants.*"] = { topright = -0.25, bottomright = -0.25 }, -- right parenthesis variants + ["0x221A.parts.top"] = { topright = 0.2, }, -- right radical top + ["0x221A.parts.bottom"] = { bottomright = 0.2 }, -- right radical bottom + ["0x221A.variants.*"] = { topright = 0.2, bottomright = 0.2 }, -- right radical variants + [0x27E9] = { topright = -0.2, bottomright = -0.2 }, -- angles + ["0x27E9.variants.*"] = { topright = -0.3, bottomright = -0.3 }, + [0x27EB] = { topright = -0.2, bottomright = -0.2 }, + ["0x27EB.variants.*"] = { topright = -0.3, bottomright = -0.3 }, }, }, @@ -411,141 +283,72 @@ return { -- }, -- }, { - -- For upright alphabets, we unset the anchor. - -- This means that accents are placed - -- centered over the character - tweak = "wipeanchors", - -- list = { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58 }, -- todo: ranges - list = { - "digitsbold", - "digitsdoublestruck", - "digitsmonospace", - "digitsnormal", - "digitssansserifbold", - "digitssansserifnormal", - "lowercasebold", - "lowercaseboldfraktur", - "lowercasedoublestruck", - "lowercasefraktur", - "lowercasegreekbold", - "lowercasegreeknormal", - "lowercasegreeksansserifbold", - "lowercasemonospace", - "lowercasenormal", - "lowercasesansserifbold", - "lowercasesansserifnormal", - "uppercasebold", - "uppercaseboldfraktur", - "uppercasedoublestruck", - "uppercasefraktur", - "uppercasegreekbold", - "uppercasegreeknormal", - "uppercasegreeksansserifbold", - "uppercasemonospace", - "uppercasenormal", -- they are italic! - "uppercasesansserifbold", - "uppercasesansserifnormal", - }, - }, - { - -- For non-italic alphabets we - -- remove italic correction. - tweak = "wipeitalics", - list = { - -- "digitsbold", - -- "digitsdoublestruck", - -- "digitsmonospace", - -- "digitsnormal", - -- "digitssansserifbold", - -- "digitssansserifnormal", - -- "lowercasebold", - -- "lowercaseboldfraktur", - -- "lowercasedoublestruck", - -- "lowercasefraktur", - "lowercasemonospace", - -- "lowercasenormal", - -- "lowercasesansserifbold", - -- "lowercasesansserifnormal", - -- "lowercasegreeknormal", - "uppercasebold", - -- "uppercaseboldfraktur", - -- "uppercasedoublestruck", - -- "uppercasefraktur", - -- "uppercasegreekbold", - -- "uppercasegreeknormal", - -- "uppercasegreeksansserifbold", - "uppercasemonospace", - "uppercasesansserifbold", - "uppercasesanserifnormal", - }, - }, - { -- This one fakes margins to get larger/smaller accents -- with for example \widetilde. tweak = "margins", list = { - [0x1D487] = { left = -.2, right = -.2 }, -- bold italic f - [0x1D489] = { left = -.2, right = -.2 }, -- bold italic h - [0x1D496] = { left = -.1, right = -.1 }, -- bold italic u - [0x1D499] = { left = -.1, right = -.1 }, -- bold italic x - - [0x1D711] = { left = -.1, right = -.1 }, -- italic varphi - [0x1D713] = { left = -.1, right = -.1 }, -- italic psi - - [0x1D659] = { left = -.1, right = -.1 }, -- sans bold italic d - [0x1D65C] = { left = -.1, right = -.1 }, -- sans bold italic g - - [0x1D409] = { left = .1, right = .1 }, -- bold upright J - [0x1D412] = { left = .1, right = .1 }, -- bold upright S - - [0x1D509] = { left = .1, right = .1 }, -- fraktur F - [0x1D50C] = { left = .1, right = .1 }, -- fraktur I - [0x1D50D] = { left = .1, right = .1 }, -- fraktur J - [0x1D51D] = { left = .1, right = .1 }, -- fraktur Z - - [0x1D538] = { left = .1, right = .1 }, -- doublestruck A - [0x1D539] = { left = .1, right = .1 }, -- doublestruck B - [0x1D53C] = { left = .1, right = .1 }, -- doublestruck E - [0x1D53D] = { left = .1, right = .1 }, -- doublestruck F - [0x1D541] = { left = .1, right = .1 }, -- doublestruck J - [0x1D542] = { left = .1, right = .1 }, -- doublestruck K - [0x1D543] = { left = .1, right = .1 }, -- doublestruck L - [0x1D547] = { left = .1, right = .1 }, -- doublestruck P - [0x1D549] = { left = .1, right = .1 }, -- doublestruck R - [0x1D54A] = { left = .1, right = .1 }, -- doublestruck S - [0x1D54B] = { left = .1, right = .1 }, -- doublestruck T - [0x1D54D] = { left = .1, right = .1 }, -- doublestruck V - [0x1D550] = { left = .1, right = .1 }, -- doublestruck Y - - [0x1D506] = { left = .1, right = .1 }, -- fraktur C - - [0x00393] = { left = .1, right = .1 }, -- upfight Gamma - [0x00396] = { left = .1, right = .1 }, -- upfight Zeta - - [0x1D5D8] = { left = .1, right = .1 }, -- sans bold E - [0x1D5D9] = { left = .1, right = .1 }, -- sans bold F - -- [0x1D5DD] = { left = .2, right = .2 }, -- sans bold J -- nope - [0x1D5DF] = { left = .1, right = .1 }, -- sans bold L - [0x1D5E6] = { left = .1, right = .1 }, -- sans bold S - - [0x1D61A] = { left = .1, right = .1 }, -- sans italic S - - [0x1D5A2] = { left = .1, right = .1 }, -- sans C - [0x1D5A4] = { left = .1, right = .1 }, -- sans E - [0x1D5A5] = { left = .1, right = .1 }, -- sans F - -- [0x1D5AB] = { left = .1, right = .1 }, -- sans L -- nope - [0x1D5AF] = { left = .1, right = .1 }, -- sans P - [0x1D5B2] = { left = .1, right = .1 }, -- sans S - [0x1D5B9] = { left = .1, right = .1 }, -- sans Z - - [0x1D4A0] = { left = .1, right = .1 }, -- script E - [0x1D4AE] = { left = .1, right = .1 }, -- script S - [0x1D4B4] = { left = .1, right = .1 }, -- script Y - - -- [0x4A] = { left = .2, right = .2 }, -- J - [0x4C] = { left = .1, right = .1 }, -- L - [0x53] = { left = .1, right = .1 }, -- S - [0x5A] = { left = .1, right = .1 }, -- Z + [0x1D487] = { left = -.2, right = -.2 }, -- bold italic f + [0x1D489] = { left = -.2, right = -.2 }, -- bold italic h + [0x1D496] = { left = -.1, right = -.1 }, -- bold italic u + [0x1D499] = { left = -.1, right = -.1 }, -- bold italic x + + [0x1D711] = { left = -.1, right = -.1 }, -- italic varphi + [0x1D713] = { left = -.1, right = -.1 }, -- italic psi + + [0x1D659] = { left = -.1, right = -.1 }, -- sans bold italic d + [0x1D65C] = { left = -.1, right = -.1 }, -- sans bold italic g + + [0x1D409] = { left = .1, right = .1 }, -- bold upright J + [0x1D412] = { left = .1, right = .1 }, -- bold upright S + + [0x1D509] = { left = .1, right = .1 }, -- fraktur F + [0x1D50C] = { left = .1, right = .1 }, -- fraktur I + [0x1D50D] = { left = .1, right = .1 }, -- fraktur J + [0x1D51D] = { left = .1, right = .1 }, -- fraktur Z + + [0x1D538] = { left = .1, right = .1 }, -- doublestruck A + [0x1D539] = { left = .1, right = .1 }, -- doublestruck B + [0x1D53C] = { left = .1, right = .1 }, -- doublestruck E + [0x1D53D] = { left = .1, right = .1 }, -- doublestruck F + [0x1D541] = { left = .1, right = .1 }, -- doublestruck J + [0x1D542] = { left = .1, right = .1 }, -- doublestruck K + [0x1D543] = { left = .1, right = .1 }, -- doublestruck L + [0x1D547] = { left = .1, right = .1 }, -- doublestruck P + [0x1D549] = { left = .1, right = .1 }, -- doublestruck R + [0x1D54A] = { left = .1, right = .1 }, -- doublestruck S + [0x1D54B] = { left = .1, right = .1 }, -- doublestruck T + [0x1D54D] = { left = .1, right = .1 }, -- doublestruck V + [0x1D550] = { left = .1, right = .1 }, -- doublestruck Y + + [0x1D506] = { left = .1, right = .1 }, -- fraktur C + + [0x00393] = { left = .1, right = .1 }, -- upfight Gamma + [0x00396] = { left = .1, right = .1 }, -- upfight Zeta + + [0x1D5D8] = { left = .1, right = .1 }, -- sans bold E + [0x1D5D9] = { left = .1, right = .1 }, -- sans bold F + -- [0x1D5DD] = { left = .2, right = .2 }, -- sans bold J -- nope + [0x1D5DF] = { left = .1, right = .1 }, -- sans bold L + [0x1D5E6] = { left = .1, right = .1 }, -- sans bold S + + [0x1D61A] = { left = .1, right = .1 }, -- sans italic S + + [0x1D5A2] = { left = .1, right = .1 }, -- sans C + [0x1D5A4] = { left = .1, right = .1 }, -- sans E + [0x1D5A5] = { left = .1, right = .1 }, -- sans F + -- [0x1D5AB] = { left = .1, right = .1 }, -- sans L -- nope + [0x1D5AF] = { left = .1, right = .1 }, -- sans P + [0x1D5B2] = { left = .1, right = .1 }, -- sans S + [0x1D5B9] = { left = .1, right = .1 }, -- sans Z + + [0x1D4A0] = { left = .1, right = .1 }, -- script E + [0x1D4AE] = { left = .1, right = .1 }, -- script S + [0x1D4B4] = { left = .1, right = .1 }, -- script Y + + -- [0x0004A] = { left = .2, right = .2 }, -- J + [0x0004C] = { left = .1, right = .1 }, -- L + [0x00053] = { left = .1, right = .1 }, -- S + [0x0005A] = { left = .1, right = .1 }, -- Z [0x1D43D] = { left = -.1, right = -.1 }, -- italic J [0x1D409] = { left = -.1, right = -.1 }, -- bold J @@ -598,16 +401,17 @@ return { -- 0x7C, -- }, -- }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, }, }, bigslots = { 1, 3, 5, 7 -- In fact, 6 is the last one. }, - -- - -- experimental fixes for mkiv: - -- - dimensions = dimensions, - kerns = kerns, }, filenames = { ["latinmodern-math-regular.otf"] = { @@ -805,3 +609,93 @@ return { }, } } + +-- For now we keep these commented as they show where we came from. + +-- [0x00060] = { yoffset = -0.05 }, -- grave +-- [0x000B4] = { yoffset = -0.05 }, -- acute +-- [0x002C6] = { yoffset = -0.05 }, -- hat +-- [0x002DC] = { yoffset = -0.05 }, -- tilde +-- [0x000AF] = { yoffset = -0.075 }, -- bar +-- [0x002D8] = { yoffset = -0.05 }, -- breve +-- [0x002D9] = { yoffset = -0.05 }, -- dot +-- [0x000A8] = { yoffset = -0.05 }, -- ddot +-- [0x020DB] = { yoffset = 0.2 }, -- dddot (done below!) +-- [0x002DA] = { width = 0 }, -- ring (bounding box is wrong) +-- [0x002C7] = { yoffset = -0.05 }, -- check +-- [0x020D7] = { yoffset = -0.05 }, -- vec + +-- [0x00300] = { yoffset = -0.03, all = true }, -- widegrave +-- [0x00301] = { yoffset = -0.03, all = true }, -- wideacute +-- [0x00302] = { yoffset = -0.075, all = true }, -- widehat +-- [0x00303] = { yoffset = -0.05, all = true }, -- widetilde +-- [0x00304] = { yoffset = -0.02, all = true }, -- widebar +-- [0x00306] = { yoffset = -0.05, all = true }, -- widebreve +-- [0x00307] = { yoffset = -0.027, all = true }, -- widedot +-- [0x00308] = { yoffset = -0.027, all = true }, -- wideddot +-- [0x020DB] = { yoffset = -0.065, all = true }, -- widedddot +-- [0x0030C] = { yoffset = -0.05, all = true }, -- widecheck +-- [0x0030A] = { yoffset = -0.025, all = true }, -- widering + +-- [0x0212C] = { width = 0.95, italic = 0.05 }, -- script B +-- [0x1D49E] = { width = 0.8, italic = 0.25 }, -- script C +-- [0x1D49F] = { width = 0.9, italic = 0.11 }, -- script D +-- [0x02130] = { width = 0.85, italic = 0.18 }, -- script E +-- [0x02131] = { width = 0.75, italic = 0.3 }, -- script F +-- [0x1D4A2] = { width = 0.9, italic = 0.11 }, -- script G +-- [0x0210B] = { width = 0.85, italic = 0.18 }, -- script H +-- [0x02110] = { width = 0.8, italic = 0.25 }, -- script I +-- [0x1D4A5] = { width = 0.8, italic = 0.25 }, -- script J +-- [0x1D4A6] = { width = 0.9, italic = 0.11 }, -- script K +-- [0x02112] = { width = 0.95, italic = 0.05 }, -- script L +-- [0x02133] = { width = 0.9, italic = 0.11 }, -- script M +-- [0x1D4A9] = { width = 0.85, italic = 0.18 }, -- script N +-- [0x1D4AA] = { width = 0.95, italic = 0.05 }, -- script O +-- [0x1D4AB] = { width = 0.8, italic = 0.25 }, -- script P +-- [0x1D4AB] = { width = 0.95, italic = 0.05 }, -- script Q +-- [0x0211B] = { width = 0.95, italic = 0.05 }, -- script R +-- [0x1D4AE] = { width = 0.9, italic = 0.11 }, -- script S +-- [0x1D4AF] = { width = 0.75, italic = 0.33 }, -- script T +-- [0x1D4B0] = { width = 0.9, italic = 0.11 }, -- script U +-- [0x1D4B1] = { width = 0.8, italic = 0.25 }, -- script V +-- [0x1D4B2] = { width = 0.8, italic = 0.25 }, -- script W +-- [0x1D4B3] = { width = 0.9, italic = 0.11 }, -- script X +-- [0x1D4B4] = { width = 0.85, italic = 0.18 }, -- script Y +-- [0x1D4B5] = { width = 0.95, italic = 0.05 }, -- script Z + +-- Setting anchors to shift the location of accents +-- Note: Many non-italic alphabets are wiped below +-- Todo: Check the less common italic alphabets + +-- { +-- -- For non-italic alphabets we +-- -- remove italic correction. +-- tweak = "wipeitalics", +-- list = { +-- -- "digitsbold", +-- -- "digitsdoublestruck", +-- -- "digitsmonospace", +-- -- "digitsnormal", +-- -- "digitssansserifbold", +-- -- "digitssansserifnormal", +-- -- "lowercasebold", +-- -- "lowercaseboldfraktur", +-- -- "lowercasedoublestruck", +-- -- "lowercasefraktur", +-- "lowercasemonospace", +-- -- "lowercasenormal", +-- -- "lowercasesansserifbold", +-- -- "lowercasesansserifnormal", +-- -- "lowercasegreeknormal", +-- "uppercasebold", +-- -- "uppercaseboldfraktur", +-- -- "uppercasedoublestruck", +-- -- "uppercasefraktur", +-- -- "uppercasegreekbold", +-- -- "uppercasegreeknormal", +-- -- "uppercasegreeksansserifbold", +-- "uppercasemonospace", +-- "uppercasesansserifbold", +-- "uppercasesanserifnormal", +-- }, +-- }, diff --git a/tex/context/fonts/mkiv/lucida-opentype-math.lfg b/tex/context/fonts/mkiv/lucida-opentype-math.lfg index 97cf97ab1..6a5f5ab36 100644 --- a/tex/context/fonts/mkiv/lucida-opentype-math.lfg +++ b/tex/context/fonts/mkiv/lucida-opentype-math.lfg @@ -1,37 +1,10 @@ local common = fonts.goodies.load("common-math.lfg") local presets = common.mathematics.tweaks.presets -local dimensions, kerns if CONTEXTLMTXMODE == 0 then - -- local kern_250 = { bottomright = { { kern = -250 } }, force = true } - - -- kerns = { - -- [0x1D449] = kern_250, -- - -- [0x1D44A] = kern_250, -- 𝑊 - -- } - - dimensions = { - default = { -- experimental values - -- [0x02044] = { xoffset = 275, width = 600 }, - -- primes - [0xFE932] = { width = 200 }, - [0xFE933] = { width = 500 }, - [0xFE934] = { width = 800 }, - [0xFE935] = { width = 1100 }, - -- reverse primes - [0xFE935] = { width = 200 }, - [0xFE936] = { width = 500 }, - [0xFE937] = { width = 800 }, - }, - } - -end - --- When set this will bypass the italic correction hackery! local integral_variants = { bottomright = -0.20 } --- local integral_top = { topright = 0.05 } +----- integral_top = { topright = 0.05 } local integral_bottom = { bottomright = -0.45 } - return { name = "lucida-opentype-math", version = "1.00", @@ -57,7 +30,7 @@ return { -- DisplayOperatorMinHeight = 1800, -- 1300 in font (only one) PrimeRaisePercent = 60, -- 50 default PrimeRaiseComposedPercent = 50, -- 25 default --- AxisHeight = 325, + -- AxisHeight = 325, -- we keep the old fonts as they are (also for demos) }, tweaks = { aftercopying = { @@ -69,16 +42,24 @@ return { tweak = "fixoldschool", version = "Version 1.802", }, --- { --- tweak = "showinfo", --- version = "Version 1.803", --- }, + -- { + -- tweak = "showinfo", + -- version = "Version 1.803", + -- }, { tweak = "addmirrors", }, - presets.mathxitsarabic { - rscale = 1.05 - }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { rscale = 1 }, + presets.rsfsuprighttoscript { rscale = 1 }, + presets.moderntocalligraphic { rscale = 1 }, + presets.eulertocalligraphic { rscale = 1 }, + presets.xitsarabic { rscale = 1.05 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { factor = 1.5 }, + presets.wipeitalics { }, { tweak = "replacealphabets", list = { @@ -87,6 +68,17 @@ return { target = "uppercasecalligraphic", feature = "ss04", }, + { + source = "lowercasescript", + target = "lowercasecalligraphic", + feature = "ss04", + }, + { + source = "uppercaseboldscript", + target = "uppercaseboldcalligraphic", + feature = "ss04", + }, + -- No lowercase bold calligraphic/script in font }, }, { @@ -101,8 +93,9 @@ return { }, }, { - tweak = "dimensions", - list = { + tweak = "dimensions", + version = "Version 1.802", + list = { -- these we fix here. Remove when we have new version of Lucida ["0x23DC.parts.1"] = { xoffset = -0.075, height = .4, yoffset = -0.6 }, ["0x23DC.parts.2"] = { height = .4, yoffset = -0.6 }, @@ -134,34 +127,34 @@ return { }, -- First we set the dimensions of the initial accent which started out as zero but we want -- a proper width. - { - tweak = "dimensions", - list = { - -- [0x00302] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widehat - -- [0x00303] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widetilde - -- [0x00306] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widebreve - -- [0x0030C] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widecheck - }, - }, +-- { +-- tweak = "dimensions", +-- list = { +-- -- [0x00302] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widehat +-- -- [0x00303] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widetilde +-- -- [0x00306] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widebreve +-- -- [0x0030C] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widecheck +-- }, +-- }, -- Then we deal with all offsets and heights in one go. So we treat the initial accent -- as well as the variants here. - { - tweak = "dimensions", - list = { - -- here we want to apply to all - -- [0x00300] = { yoffset = -0.02, height = .95, all = true }, -- widegrave : 0x0060 - -- [0x00301] = { yoffset = -0.02, height = .95, all = true }, -- wideacute : 0x00B4 - -- [0x00302] = { yoffset = -0.03, height = .95, all = true }, -- widehat : 0x02C6 - -- [0x00303] = { yoffset = -0.02, height = .95, all = true }, -- widetilde : 0x02DC - -- [0x00306] = { yoffset = -0.03, height = .95, all = true }, -- widebre : 0x02D8 - -- [0x0030A] = { yoffset = 0.00, height = .95, all = true }, -- widering : 0x02DA - -- [0x0030C] = { yoffset = -0.03, height = .95, all = true }, -- widecheck : 0x02C7 - -- [0x00304] = { yoffset = -0.05, height = .95, all = true }, -- widebar : 0x00AF - -- [0x00307] = { yoffset = -0.03, height = .95, all = true }, -- widedot : 0x02D9 - -- [0x00308] = { yoffset = -0.03, height = .95, all = true }, -- wideddot : 0x00A8 - -- [0x020DB] = { yoffset = -0.015, height = .95, all = true }, -- widedddot : 0x20DB (self) - }, - }, +-- { +-- tweak = "dimensions", +-- list = { +-- -- here we want to apply to all +-- -- [0x00300] = { yoffset = -0.02, height = .95, all = true }, -- widegrave : 0x0060 +-- -- [0x00301] = { yoffset = -0.02, height = .95, all = true }, -- wideacute : 0x00B4 +-- -- [0x00302] = { yoffset = -0.03, height = .95, all = true }, -- widehat : 0x02C6 +-- -- [0x00303] = { yoffset = -0.02, height = .95, all = true }, -- widetilde : 0x02DC +-- -- [0x00306] = { yoffset = -0.03, height = .95, all = true }, -- widebre : 0x02D8 +-- -- [0x0030A] = { yoffset = 0.00, height = .95, all = true }, -- widering : 0x02DA +-- -- [0x0030C] = { yoffset = -0.03, height = .95, all = true }, -- widecheck : 0x02C7 +-- -- [0x00304] = { yoffset = -0.05, height = .95, all = true }, -- widebar : 0x00AF +-- -- [0x00307] = { yoffset = -0.03, height = .95, all = true }, -- widedot : 0x02D9 +-- -- [0x00308] = { yoffset = -0.03, height = .95, all = true }, -- wideddot : 0x00A8 +-- -- [0x020DB] = { yoffset = -0.015, height = .95, all = true }, -- widedddot : 0x20DB (self) +-- }, +-- }, -- We now copy these to the not wide slots so that we can set these to stretch as well, -- if only because it is less confusing and more consistent. { @@ -252,6 +245,12 @@ return { -- [0x21CC] = false, } }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, }, }, alternates = { @@ -260,6 +259,8 @@ return { operator = { feature = 'ss03', value = 1, comment = "Mathematical Alternative Smaller Operators" }, calligraphic = { feature = 'ss04', value = 1, comment = "Mathematical Alternative Calligraphic Characters" }, zero = { feature = 'ss05', value = 1, comment = "Mathematical Alternative Zero" }, + multipledots = { feature = 'ss06', value = 1, comment = "Mathematical Alternative Multiple Dots" }, + ldots = { feature = 'ss07', value = 1, comment = "Mathematical Alternative Ellipsis" }, }, bigslots = { 1, 2, 3, 4 diff --git a/tex/context/fonts/mkiv/minion-math.lfg b/tex/context/fonts/mkiv/minion-math.lfg index 5216e1289..a768c0518 100644 --- a/tex/context/fonts/mkiv/minion-math.lfg +++ b/tex/context/fonts/mkiv/minion-math.lfg @@ -2,18 +2,6 @@ -- ConTeXt (math) develoipment have official copies of all the text minion and math -- fonts without restrictions of usage in documents. -local dimensions, kerns if CONTEXTLMTXMODE == 0 then - - local kern_W = { bottomright = { { kern = -150 } } } - local kern_V = { bottomright = { { kern = -200 } } } - - kerns = { - [0x1D449] = kern_V, -- 𝑉 - [0x1D44A] = kern_W, -- 𝑊 - } - -end - local common = fonts.goodies.load("common-math.lfg") local presets = common.mathematics.tweaks.presets @@ -67,24 +55,19 @@ return { { tweak = "addmirrors", }, - presets.matheulercalligraphic { rscale = 0.95 }, - presets.mathrsfscript { rscale = 0.95 }, - presets.mathxitsarabic { rscale = 0.88 }, + presets.rsfstoscript { rscale = 0.97 }, + presets.rsfsuprighttoscript { rscale = 0.97 }, + presets.moderntocalligraphic { rscale = 0.97 }, + presets.eulertocalligraphic { rscale = 0.97 }, + presets.xitsarabic { rscale = 0.88 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { factor = 1.3 }, + presets.wipeitalics { }, { tweak = "simplifykerns", }, - presets.moveitalics { - correct = true - }, - { -- Check! - tweak = "replacealphabets", - list = { - { - source = "uppercasecalligraphic", - target = "uppercasescript", - }, - }, - }, { tweak = "extendaccents", }, @@ -115,12 +98,13 @@ return { tweak = "addfourier", variant = 1, }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, }, }, - -- - -- experimental fixes for mkiv: - -- - dimensions = dimensions, - kerns = kerns, }, } diff --git a/tex/context/fonts/mkiv/pagella-math.lfg b/tex/context/fonts/mkiv/pagella-math.lfg index 59eafeaaf..032450426 100644 --- a/tex/context/fonts/mkiv/pagella-math.lfg +++ b/tex/context/fonts/mkiv/pagella-math.lfg @@ -1,34 +1,3 @@ -local dimensions, kerns if CONTEXTLMTXMODE == 0 then - - local kern_V = { bottomright = { { kern = -200 } } } - local kern_W = { bottomright = { { kern = -100 } } } - - dimensions = { - default = { - -- [0x1D453] = { xoffset = 162, width = 278 + 162 },-- 𝑓 - -- [0x1D453] = offset_f, -- 𝑓 - -- ["1:0x1D453"] = offset_f, -- needed for compact - -- ["2:0x1D453"] = offset_f, -- needed for compact - -- ["*:0x1D453"] = offset_f, -- 𝑓 - }, - } - - kerns = { - -- [0x1D449] = kern_V, -- 𝑉 - -- ["1:0x1D449"] = kern_V, -- needed for compact - -- ["2:0x1D449"] = kern_V, -- needed for compact - -- [0x1D44A] = kern_W, -- 𝑊 - -- ["1:0x1D44A"] = kern_W, -- needed for compact - -- ["2:0x1D44A"] = kern_W, -- needed for compact - -- ["*:0x1D453"] = kern_f, - ["*:0x1D449"] = kern_V, -- 𝑉 - ["*:0x1D44A"] = kern_W, -- 𝑊 - } - -end - --- When set this will bypass the italic correction hackery! - local common = fonts.goodies.load("common-math.lfg") local presets = common.mathematics.tweaks.presets @@ -77,34 +46,43 @@ return { scale = 0.9, -- fake = 0.65, }, + { + tweak = "replacealphabets", + feature = "euleroverpagella", + filename = "euler.otf", + list = { + -- { source = { first = 0x02100, last = 0x0210D } }, -- no 0x2210E + -- { source = { first = 0x0210F, last = 0x02BFF } }, + { source = { first = 0x02100, last = 0x02BFF } }, + { source = { first = 0x1D400, last = 0x1D7FF } }, + { source = { first = 0x1D538, last = 0x1D550 } }, + }, + }, { tweak = "addmirrors", }, - presets.matheulercalligraphic { rscale = 0.97 }, - presets.mathrsfscript { rscale = 0.97 }, - presets.mathxitsarabic { rscale = 0.95 }, { - -- When it makes sense we get rid of italics. - tweak = "moveitalics", - correct = true, + tweak = "fixoldschool", + feature = "euleroverpagella", + }, + + presets.scripttocalligraphic { }, + presets.rsfstoscript { }, + presets.rsfsuprighttoscript { }, + presets.moderntocalligraphic { }, + presets.eulertocalligraphic { }, + presets.xitsarabic { rscale = 0.95 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { factor = 1.5 }, -- we need to check the 1.5 + presets.wipeanchors { }, + presets.wipeitalics { }, + { + tweak = "parameters", + feature = "euleroverpagella", list = { - "lowercasenormal", - "lowercaseitalic", - "lowercasebold", - "lowercasebolditalic", - "lowercasegreeknormal", - "lowercasegreekitalic", - "lowercasegreekbold", - "lowercasegreekbolditalic", - "uppercasenormal", - "uppercaseitalic", - "uppercasebold", - "uppercasebolditalic", - "uppercasegreeknormal", - "uppercasegreekitalic", - "uppercasegreekbold", - "uppercasegreekbolditalic", - mathematics.tweaks.subsets.dotless, + RadicalRuleThickness = 54, } }, { @@ -249,6 +227,20 @@ return { }, }, }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, + { + tweak = "parameters", + feature = "emulatelmtx", + comment = "this is for mkiv", + list = { + AccentBaseHeight = 400, + } + }, }, }, bigslots = { @@ -257,45 +249,36 @@ return { alternates = { dotless = { feature = 'dtls', value = 1, comment = "Mathematical Dotless Forms" }, }, - -- - -- experimental fixes for mkiv: - -- - dimensions = dimensions, - kerns = kerns, }, } +-- For now we keep these commented as they show where we came from. - - - --- Old values - - -- { - -- tweak = "dimensions", - -- list = { -- offset width italic - -- [0x020D7] = { yoffset = -0.05 }, -- vec - -- [0x1D44E] = { xoffset = 0, width = 1, italic = 0, anchor = 0.9 }, -- a - -- [0x1D44F] = { xoffset = 0, width = 1, italic = 0, anchor = 1.3 }, -- b - -- [0x1D450] = { xoffset = 0, width = 1, italic = 0, anchor = 0.9 }, -- c - -- [0x1D451] = { xoffset = 0, width = 1, italic = 0, anchor = 0.7 }, -- d - -- [0x1D452] = { xoffset = 0, width = 1, italic = 0, anchor = 0.9 }, -- e - -- [0x1D453] = { xoffset = 0.50, width = 1.70, italic = 0.6, anchor = 1.2 }, -- f - -- [0x1D454] = { xoffset = 0.10, width = 1.15, italic = 0.2 }, -- g - -- [0x0210E] = { xoffset = 0, width = 1, italic = 0, anchor = 1.3 }, -- h - -- [0x1D458] = { xoffset = 0, width = 1, italic = 0, anchor = 1.3 }, -- k - -- [0x1D459] = { xoffset = 0, width = 1, italic = 0, anchor = 0.9 }, -- l - -- [0x1D45E] = { xoffset = 0, width = 1, italic = 0, anchor = 0.9 }, -- q - -- [0x1D463] = { xoffset = 0, width = 1, italic = 0, anchor = 1.25 }, -- v - -- [0x1D464] = { xoffset = 0, width = 1, italic = 0, anchor = 1.2 }, -- w - -- [0x1D6FE] = { xoffset = 0, width = 1, italic = 0, anchor = 1.2 }, -- \gamma - -- [0x1D706] = { xoffset = 0, width = 1, italic = 0, anchor = 1.05 }, -- \lambda - -- [0x1D70A] = { xoffset = 0, width = 1, italic = 0, anchor = 1.2 }, -- \omicron - -- [0x1D70D] = { xoffset = 0, width = 1, italic = 0, anchor = 1.2 }, -- \varsigma - -- [0x1D70E] = { xoffset = 0, width = 1, italic = 0, anchor = 1.1 }, -- \sigma - -- [0x1D70F] = { xoffset = -.10, width = 1, italic = 0, anchor = 0.95 }, -- \tau - -- [0x1D712] = { xoffset = 0.1, width = 1.2, italic = 0.1 }, -- \chi - -- [0x1D713] = { xoffset = -0.05, width = 0.95, italic = 0.1 }, -- \psi - -- [0x1D71D] = { xoffset = 0, width = 1, italic = 0, anchor = 0.7 }, -- \varpi - -- }, - -- }, +-- { +-- tweak = "dimensions", +-- list = { -- offset width italic +-- [0x020D7] = { yoffset = -0.05 }, -- vec +-- [0x1D44E] = { xoffset = 0, width = 1, italic = 0, anchor = 0.9 }, -- a +-- [0x1D44F] = { xoffset = 0, width = 1, italic = 0, anchor = 1.3 }, -- b +-- [0x1D450] = { xoffset = 0, width = 1, italic = 0, anchor = 0.9 }, -- c +-- [0x1D451] = { xoffset = 0, width = 1, italic = 0, anchor = 0.7 }, -- d +-- [0x1D452] = { xoffset = 0, width = 1, italic = 0, anchor = 0.9 }, -- e +-- [0x1D453] = { xoffset = 0.50, width = 1.70, italic = 0.6, anchor = 1.2 }, -- f +-- [0x1D454] = { xoffset = 0.10, width = 1.15, italic = 0.2 }, -- g +-- [0x0210E] = { xoffset = 0, width = 1, italic = 0, anchor = 1.3 }, -- h +-- [0x1D458] = { xoffset = 0, width = 1, italic = 0, anchor = 1.3 }, -- k +-- [0x1D459] = { xoffset = 0, width = 1, italic = 0, anchor = 0.9 }, -- l +-- [0x1D45E] = { xoffset = 0, width = 1, italic = 0, anchor = 0.9 }, -- q +-- [0x1D463] = { xoffset = 0, width = 1, italic = 0, anchor = 1.25 }, -- v +-- [0x1D464] = { xoffset = 0, width = 1, italic = 0, anchor = 1.2 }, -- w +-- [0x1D6FE] = { xoffset = 0, width = 1, italic = 0, anchor = 1.2 }, -- \gamma +-- [0x1D706] = { xoffset = 0, width = 1, italic = 0, anchor = 1.05 }, -- \lambda +-- [0x1D70A] = { xoffset = 0, width = 1, italic = 0, anchor = 1.2 }, -- \omicron +-- [0x1D70D] = { xoffset = 0, width = 1, italic = 0, anchor = 1.2 }, -- \varsigma +-- [0x1D70E] = { xoffset = 0, width = 1, italic = 0, anchor = 1.1 }, -- \sigma +-- [0x1D70F] = { xoffset = -.10, width = 1, italic = 0, anchor = 0.95 }, -- \tau +-- [0x1D712] = { xoffset = 0.1, width = 1.2, italic = 0.1 }, -- \chi +-- [0x1D713] = { xoffset = -0.05, width = 0.95, italic = 0.1 }, -- \psi +-- [0x1D71D] = { xoffset = 0, width = 1, italic = 0, anchor = 0.7 }, -- \varpi +-- }, +-- }, diff --git a/tex/context/fonts/mkiv/schola-math.lfg b/tex/context/fonts/mkiv/schola-math.lfg index 54d24ffa3..9a7b3dca6 100644 --- a/tex/context/fonts/mkiv/schola-math.lfg +++ b/tex/context/fonts/mkiv/schola-math.lfg @@ -1,21 +1,9 @@ -local dimensions, kerns if CONTEXTLMTXMODE == 0 then - - local kern_V = { bottomright = { { kern = -200 } }, topright = { { kern = 50 } } } - local kern_W = { bottomright = { { kern = -100 } }, topright = { { kern = 50 } } } - - kerns = { - [0x1D449] = kern_V, -- 𝑉 - [0x1D44A] = kern_W, -- 𝑊 - } - -end +local common = fonts.goodies.load("common-math.lfg") +local presets = common.mathematics.tweaks.presets local integral_variants = { bottomright = -0.20 } local integral_bottom = { bottomright = -0.20 } -local common = fonts.goodies.load("common-math.lfg") -local presets = common.mathematics.tweaks.presets - return { name = "schola-math", version = "1.00", @@ -55,10 +43,17 @@ return { { tweak = "addmirrors", }, - presets.matheulercalligraphic { rscale = 1 }, - presets.mathrsfscript { rscale = 1 }, - presets.mathxitsarabic { rscale = 0.93 }, - presets.moveitalics { correct = true }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { }, + presets.rsfsuprighttoscript { }, + presets.moderntocalligraphic { }, + presets.eulertocalligraphic { }, + presets.xitsarabic { rscale = 0.93 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { }, + presets.wipeitalics { }, { tweak = "kerns", list = { @@ -161,6 +156,12 @@ return { -- scale = 1.25, variant = 1, }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, }, }, bigslots = { @@ -169,10 +170,5 @@ return { alternates = { dotless = { feature = 'dtls', value = 1, comment = "Mathematical Dotless Forms" }, }, - -- - -- experimental fixes for mkiv: - -- - dimensions = dimensions, - kerns = kerns, }, } diff --git a/tex/context/fonts/mkiv/stix-two-math.lfg b/tex/context/fonts/mkiv/stix-two-math.lfg index 8b03a7730..1f370359f 100644 --- a/tex/context/fonts/mkiv/stix-two-math.lfg +++ b/tex/context/fonts/mkiv/stix-two-math.lfg @@ -1,11 +1,10 @@ --- When set this will bypass the italic correction hackery! -local integral_variants = { bottomright = -0.4 } --- local integral_top = { topright = 0.05 } -local integral_bottom = { bottomright = -0.35 } - local common = fonts.goodies.load("common-math.lfg") local presets = common.mathematics.tweaks.presets +local integral_variants = { bottomright = -0.4 } +----- integral_top = { topright = 0.05 } +local integral_bottom = { bottomright = -0.35 } + return { name = "stix-two-math", version = "1.00", @@ -61,12 +60,35 @@ return { { tweak = "addmirrors", }, - presets.mathxitsarabic { rscale = 0.95 }, + -- MS: we need to check this, I moved it up { - tweak = "simplifykerns", + tweak = "replacealphabets", + list = { + { + source = "uppercasescript", + target = "uppercasecalligraphic", + }, + { + source = "uppercasescript", + target = "uppercasescript", + feature = "ss01", + }, + }, }, - presets.moveitalics { - correct = true + -- + presets.scripttocalligraphic { }, + presets.rsfstoscript { }, + presets.rsfsuprighttoscript { }, + presets.moderntocalligraphic { }, + presets.eulertocalligraphic { }, + presets.xitsarabic { rscale = 0.95 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { }, + presets.wipeitalics { }, + { + tweak = "simplifykerns", }, { tweak = "kerns", @@ -97,20 +119,6 @@ return { ["0x2233.variants.*"] = integral_variants, ["0x2233.parts.top"] = integral_top, ["0x2233.parts.bottom"] = integral_bottom, }, }, - { - tweak = "replacealphabets", - list = { - { - source = "uppercasescript", - target = "uppercasecalligraphic", - }, - { - source = "uppercasescript", - target = "uppercasescript", - feature = "ss01", - }, - }, - }, -- Accents are a mess. We migrate the extensibles from the combiners to the base accent -- and then need to tweak the width (which is auto set because it was zero with a large -- accent anchor offset). First we copy and fix. @@ -197,6 +205,12 @@ return { } } }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, }, }, bigslots = { diff --git a/tex/context/fonts/mkiv/termes-math.lfg b/tex/context/fonts/mkiv/termes-math.lfg index 6a54535df..6e3eb9306 100644 --- a/tex/context/fonts/mkiv/termes-math.lfg +++ b/tex/context/fonts/mkiv/termes-math.lfg @@ -1,28 +1,9 @@ -local dimensions, kerns if CONTEXTLMTXMODE == 0 then - - -- local kern_V = { bottomright = { { kern = -200 } } } - -- local kern_W = { bottomright = { { kern = -100 } } } - -- local offset_f = { xoffset = "llx" } - -- - -- dimensions = { - -- default = { - -- [0x1D453] = offset_f, -- 𝑓 - -- }, - -- } - -- - -- kerns = { - -- [0x1D449] = kern_V, -- 𝑉 - -- [0x1D44A] = kern_W, -- 𝑊 - -- } - -end +local common = fonts.goodies.load("common-math.lfg") +local presets = common.mathematics.tweaks.presets local integral_variants = { bottomright = -0.20 } local integral_bottom = { bottomright = -0.30 } -local common = fonts.goodies.load("common-math.lfg") -local presets = common.mathematics.tweaks.presets - return { name = "termes-math", version = "1.00", @@ -61,10 +42,17 @@ return { { tweak = "addmirrors", }, - presets.matheulercalligraphic { rscale = 0.95 }, - presets.mathrsfscript { rscale = 0.95 }, - presets.mathxitsarabic { rscale = 0.88 }, - presets.moveitalics { correct = true }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { rscale = 0.97 }, + presets.rsfsuprighttoscript { rscale = 0.97 }, + presets.moderntocalligraphic { rscale = 0.97 }, + presets.eulertocalligraphic { rscale = 0.97 }, + presets.xitsarabic { rscale = 0.88 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { factor = 1.5 }, + presets.wipeitalics { }, { tweak = "kerns", list = { @@ -165,6 +153,12 @@ return { tweak = "addfourier", variant = 1, }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, }, }, bigslots = { @@ -173,32 +167,29 @@ return { alternates = { dotless = { feature = 'dtls', value = 1, comment = "Mathematical Dotless Forms" }, }, - -- - -- experimental fixes for mkiv: - -- - dimensions = dimensions, - kerns = kerns, }, } +-- For now we keep these commented as they show where we came from. - -- Do a testrun with hats on these: - -- { - -- tweak = "dimensions", - -- list = { - -- [0x1D44F] = { width = 1, italic = 0, anchor = 1.3 }, -- b - -- [0x1D451] = { width = 1, italic = 0, anchor = 0.8 }, -- d - -- [0x1D452] = { width = 1, italic = 0, anchor = 0.9 }, -- e - -- [0x0210E] = { width = 1, italic = 0, anchor = 1.3 }, -- h - -- [0x1D458] = { width = 1, italic = 0, anchor = 1.3 }, -- k - -- [0x1D453] = { xoffset = 0.6, width = 1.4, italic = 1.2, anchor = 1.5 }, -- f - -- [0x1D457] = { xoffset = 0.5, width = 1.3, italic = 1.7 }, -- j - -- [0x1D45D] = { xoffset = 0.15, width = 1.15, italic = 0, anchor = 1.4 }, -- p - -- [0x1D45E] = { width = 1, italic = 0, anchor = 0.9 }, -- q - -- [0x1D464] = { width = 1, italic = 0, anchor = 1.1 }, -- w - -- [0x1D6FE] = { width = 1, italic = 0, anchor = 1.1 }, -- \gamma - -- [0x1D706] = { width = 1, italic = 0, anchor = 1.05 }, -- \lambda - -- [0x1D70A] = { width = 1, italic = 0, anchor = 1.2 }, -- \omicron - -- [0x1D70F] = { width = 1, italic = 0, anchor = 1.05 }, -- \tau - -- }, - -- }, +-- Do a testrun with hats on these: +-- +-- { +-- tweak = "dimensions", +-- list = { +-- [0x1D44F] = { width = 1, italic = 0, anchor = 1.3 }, -- b +-- [0x1D451] = { width = 1, italic = 0, anchor = 0.8 }, -- d +-- [0x1D452] = { width = 1, italic = 0, anchor = 0.9 }, -- e +-- [0x0210E] = { width = 1, italic = 0, anchor = 1.3 }, -- h +-- [0x1D458] = { width = 1, italic = 0, anchor = 1.3 }, -- k +-- [0x1D453] = { xoffset = 0.6, width = 1.4, italic = 1.2, anchor = 1.5 }, -- f +-- [0x1D457] = { xoffset = 0.5, width = 1.3, italic = 1.7 }, -- j +-- [0x1D45D] = { xoffset = 0.15, width = 1.15, italic = 0, anchor = 1.4 }, -- p +-- [0x1D45E] = { width = 1, italic = 0, anchor = 0.9 }, -- q +-- [0x1D464] = { width = 1, italic = 0, anchor = 1.1 }, -- w +-- [0x1D6FE] = { width = 1, italic = 0, anchor = 1.1 }, -- \gamma +-- [0x1D706] = { width = 1, italic = 0, anchor = 1.05 }, -- \lambda +-- [0x1D70A] = { width = 1, italic = 0, anchor = 1.2 }, -- \omicron +-- [0x1D70F] = { width = 1, italic = 0, anchor = 1.05 }, -- \tau +-- }, +-- }, diff --git a/tex/context/fonts/mkiv/type-imp-minion.mkiv b/tex/context/fonts/mkiv/type-imp-minion.mkiv index b158deddf..aa953623c 100644 --- a/tex/context/fonts/mkiv/type-imp-minion.mkiv +++ b/tex/context/fonts/mkiv/type-imp-minion.mkiv @@ -11,8 +11,8 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\definefontfallback[MinionMathFallback] [file:latinmodern-math.otf][uppercasescript] -\definefontfallback[MinionBoldMathFallback][file:latinmodern-math.otf][uppercasescript] +% \definefontfallback[MinionMathFallback] [file:latinmodern-math.otf][uppercasescript] +% \definefontfallback[MinionBoldMathFallback][file:latinmodern-math.otf][uppercasescript] \starttypescriptcollection[minion] @@ -34,14 +34,14 @@ \starttypescript [\s!math][minion][\s!all] \loadfontgoodies[minion-math] - \definefontsynonym[\s!MathRoman] [Minion-Math] [\s!features={\s!math\mathsizesuffix,mathextra},\s!designsize=\s!auto,\s!goodies=minion-math,\s!fallbacks=MinionMathFallback] - \definefontsynonym[\s!MathRomanBold][Minion-BoldMath][\s!features={\s!math\mathsizesuffix,mathextra},\s!designsize=\s!auto,\s!goodies=minion-math,\s!fallbacks=MinionBoldMathFallback] + \definefontsynonym[\s!MathRoman] [Minion-Math] [\s!features={\s!math\mathsizesuffix,mathextra},\s!designsize=\s!auto,\s!goodies=minion-math] % ,\s!fallbacks=MinionMathFallback] + \definefontsynonym[\s!MathRomanBold][Minion-BoldMath][\s!features={\s!math\mathsizesuffix,mathextra},\s!designsize=\s!auto,\s!goodies=minion-math] % ,\s!fallbacks=MinionBoldMathFallback] \stoptypescript \starttypescript [\s!math][minion-medium][\s!all] \loadfontgoodies[minion-math] - \definefontsynonym[\s!MathRoman] [Minion-Math] [\s!features={\s!math\mathsizesuffix,mathextra},\s!designsize=\s!auto,\s!goodies=minion-math,\s!fallbacks=MinionMathFallback] - \definefontsynonym[\s!MathRomanBold][Minion-MediumMath][\s!features={\s!math\mathsizesuffix,mathextra},\s!designsize=\s!auto,\s!goodies=minion-math,\s!fallbacks=MinionBoldMathFallback] + \definefontsynonym[\s!MathRoman] [Minion-Math] [\s!features={\s!math\mathsizesuffix,mathextra},\s!designsize=\s!auto,\s!goodies=minion-math] % ,\s!fallbacks=MinionMathFallback] + \definefontsynonym[\s!MathRomanBold][Minion-MediumMath][\s!features={\s!math\mathsizesuffix,mathextra},\s!designsize=\s!auto,\s!goodies=minion-math] % ,\s!fallbacks=MinionBoldMathFallback] \stoptypescript \starttypescript [minion,minion-medium] diff --git a/tex/context/fonts/mkiv/xits-math.lfg b/tex/context/fonts/mkiv/xits-math.lfg index 374f03a0e..9eb1a1200 100644 --- a/tex/context/fonts/mkiv/xits-math.lfg +++ b/tex/context/fonts/mkiv/xits-math.lfg @@ -44,6 +44,31 @@ return { tweak = "version", expected = "Version 1.302", }, + { + tweak = "replacealphabets", + list = { + { + source = "uppercasescript", + target = "uppercasecalligraphic", + }, + { + source = "uppercasescript", + target = "uppercasescript", + feature = "ss01", + }, + }, + }, + presets.scripttocalligraphic { }, + presets.rsfstoscript { rscale = 0.95 }, + presets.rsfsuprighttoscript { rscale = 0.95 }, + presets.moderntocalligraphic { rscale = 0.95 }, + presets.eulertocalligraphic { rscale = 0.95 }, + presets.xitsarabic { rscale = 0.88 }, + presets.fallbacks { }, + presets.moveitalics { correct = true }, + presets.moveitalics { correct = true, letters = true }, + presets.moveintegrals { factor = 1.4 }, + presets.wipeitalics { }, { tweak = "kerns", list = { @@ -55,20 +80,6 @@ return { }, }, }, - -- 0xFEOO should be chancery style, if present - { - tweak = "variants", - kind = "script", - feature = "ss01",-- this changes to chancery style for xits - -- feature = false, -- use the saved ones (see typescript) - selector = 0xFE00, - }, - -- 0xFEO1 should be roundhand style, if present - { - tweak = "variants", - kind = "script", - selector = 0xFE01, - }, { tweak = "dimensions", list = { @@ -96,6 +107,12 @@ return { tweak = "setoptions", set = { "ignorekerndimensions" } }, + -- this is the mkiv section + { + tweak = "emulatelmtx", + feature = "emulatelmtx", + comment = "this is for mkiv", + }, }, }, alternates = { diff --git a/tex/context/interface/mkii/keys-cs.xml b/tex/context/interface/mkii/keys-cs.xml index 58002a9f3..c5e12f9a1 100644 --- a/tex/context/interface/mkii/keys-cs.xml +++ b/tex/context/interface/mkii/keys-cs.xml @@ -96,7 +96,6 @@ - @@ -683,9 +682,13 @@ + + + + diff --git a/tex/context/interface/mkii/keys-it.xml b/tex/context/interface/mkii/keys-it.xml index 08686da99..92dbfde4c 100644 --- a/tex/context/interface/mkii/keys-it.xml +++ b/tex/context/interface/mkii/keys-it.xml @@ -682,6 +682,7 @@ + diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index 10d1591d5..e8138b736 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.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 : 2022-10-15 10:32 +-- merge date : 2022-10-21 21:11 do -- begin closure to overcome local limits and interference @@ -37982,27 +37982,6 @@ local fonts=fonts local handlers=fonts.handlers local registerotffeature=handlers.otf.features.register local registerafmfeature=handlers.afm.features.register -local function initialize(tfmdata,key,value) - local factor=tonumber(value) or 1 - for unicode,character in next,tfmdata.characters do - local olditalic=character.italic - if olditalic and olditalic~=0 then - character.width=character.width+olditalic - character.italic=0 - character.bottomright=-factor*olditalic - end - end -end -local specification={ - name="italicwidths", - description="add italic to width", - manipulators={ - base=initialize, - node=initialize, - } -} -registerotffeature(specification) -registerafmfeature(specification) local function initialize(tfmdata,value) if value then local parameters=tfmdata.parameters diff --git a/tex/generic/context/luatex/luatex-math.lua b/tex/generic/context/luatex/luatex-math.lua index c316182ba..2696bd961 100644 --- a/tex/generic/context/luatex/luatex-math.lua +++ b/tex/generic/context/luatex/luatex-math.lua @@ -33,7 +33,6 @@ local gaps = { [0x1D551] = 0x02124, } - local function fixmath(tfmdata,key,value) if value then local characters = tfmdata.characters @@ -51,3 +50,156 @@ fonts.handlers.otf.features.register { node = fixmath, } } + +-- This emulation is experimental and work in progress. This plain support is +-- for testing only anyway. If needed disable the feature which is there mostly +-- for MS and HH (a side effect of their math project). + +local emulate = true + +local integrals = table.tohash { 8747, 8748, 8749, 8750, 8751, 8752, 8753, 8754, +8755, 8992, 8993, 10763, 10764, 10765, 10766, 10767, 10768, 10769, 10770, 10771, +10772, 10773, 10774, 10775, 10776, 10777, 10778, 10779, 10780 } + +local italics = table.tohash { 8458, 8459, 8462, 8464, 8466, 8475, 8492, 8495, +8496, 8497, 8499, 8500, 119860, 119861, 119862, 119863, 119864, 119865, 119866, +119867, 119868, 119869, 119870, 119871, 119872, 119873, 119874, 119875, 119876, +119877, 119878, 119879, 119880, 119881, 119882, 119883, 119884, 119885, 119886, +119887, 119888, 119889, 119890, 119891, 119892, 119893, 119894, 119895, 119896, +119897, 119898, 119899, 119900, 119901, 119902, 119903, 119904, 119905, 119906, +119907, 119908, 119909, 119910, 119911, 119912, 119913, 119914, 119915, 119916, +119917, 119918, 119919, 119920, 119921, 119922, 119923, 119924, 119925, 119926, +119927, 119928, 119929, 119930, 119931, 119932, 119933, 119934, 119935, 119936, +119937, 119938, 119939, 119940, 119941, 119942, 119943, 119944, 119945, 119946, +119947, 119948, 119949, 119950, 119951, 119952, 119953, 119954, 119955, 119956, +119957, 119958, 119959, 119960, 119961, 119962, 119963, 119964, 119965, 119966, +119967, 119968, 119969, 119970, 119971, 119972, 119973, 119974, 119975, 119976, +119977, 119978, 119979, 119980, 119981, 119982, 119983, 119984, 119985, 119986, +119987, 119988, 119989, 119990, 119991, 119992, 119993, 119994, 119995, 119996, +119997, 119998, 119999, 120000, 120001, 120002, 120003, 120004, 120005, 120006, +120007, 120008, 120009, 120010, 120011, 120012, 120013, 120014, 120015, 120016, +120017, 120018, 120019, 120020, 120021, 120022, 120023, 120024, 120025, 120026, +120027, 120028, 120029, 120030, 120031, 120032, 120033, 120034, 120035, 120036, +120037, 120038, 120039, 120040, 120041, 120042, 120043, 120044, 120045, 120046, +120047, 120048, 120049, 120050, 120051, 120052, 120053, 120054, 120055, 120056, +120057, 120058, 120059, 120060, 120061, 120062, 120063, 120064, 120065, 120066, +120067, 120328, 120329, 120330, 120331, 120332, 120333, 120334, 120335, 120336, +120337, 120338, 120339, 120340, 120341, 120342, 120343, 120344, 120345, 120346, +120347, 120348, 120349, 120350, 120351, 120352, 120353, 120354, 120355, 120356, +120357, 120358, 120359, 120360, 120361, 120362, 120363, 120364, 120365, 120366, +120367, 120368, 120369, 120370, 120371, 120372, 120373, 120374, 120375, 120376, +120377, 120378, 120379, 120380, 120381, 120382, 120383, 120384, 120385, 120386, +120387, 120388, 120389, 120390, 120391, 120392, 120393, 120394, 120395, 120396, +120397, 120398, 120399, 120400, 120401, 120402, 120403, 120404, 120405, 120406, +120407, 120408, 120409, 120410, 120411, 120412, 120413, 120414, 120415, 120416, +120417, 120418, 120419, 120420, 120421, 120422, 120423, 120424, 120425, 120426, +120427, 120428, 120429, 120430, 120431, 120546, 120547, 120548, 120549, 120550, +120551, 120552, 120553, 120554, 120555, 120556, 120557, 120558, 120559, 120560, +120561, 120562, 120563, 120564, 120565, 120566, 120567, 120568, 120569, 120570, +120571, 120572, 120573, 120574, 120575, 120576, 120577, 120578, 120579, 120580, +120581, 120582, 120583, 120584, 120585, 120586, 120587, 120588, 120589, 120590, +120591, 120592, 120593, 120594, 120595, 120596, 120597, 120604, 120605, 120606, +120607, 120608, 120609, 120610, 120611, 120612, 120613, 120614, 120615, 120616, +120617, 120618, 120619, 120620, 120621, 120622, 120623, 120624, 120625, 120626, +120627, 120628, 120629, 120630, 120631, 120632, 120633, 120634, 120635, 120636, +120637, 120638, 120639, 120640, 120641, 120642, 120643, 120644, 120645, 120646, +120647, 120648, 120649, 120650, 120651, 120652, 120653, 120654, 120655, 120720, +120721, 120722, 120723, 120724, 120725, 120726, 120727, 120728, 120729, 120730, +120731, 120732, 120733, 120734, 120735, 120736, 120737, 120738, 120739, 120740, +120741, 120742, 120743, 120744, 120745, 120746, 120747, 120748, 120749, 120750, +120751, 120752, 120753, 120754, 120755, 120756, 120757, 120758, 120759, 120760, +120761, 120762, 120763, 120764, 120765, 120766, 120767, 120768, 120769, 120770, +120771 } + +local function emulatelmtx(tfmdata,key,value) + if tfmdata.mathparameters and not tfmdata.emulatedlmtx then + tfmdata.fonts = { { id = 0 } } + tfmdata.type = "virtual" + tfmdata.properties.virtualized = true + end +end + +fonts.handlers.otf.features.register { + name = "emulate lmtx", + description = "emulate lmtx mode", + default = emulate, + manipulators = { base = emulatelmtx }, +} + +local function emulatelmtx(tfmdata,key,value) + if tfmdata.mathparameters and not tfmdata.emulatedlmtx then + local targetcharacters = tfmdata.characters + local targetdescriptions = tfmdata.descriptions + local factor = tfmdata.parameters.factor + local function getllx(u) + local d = targetdescriptions[u] + if d then + local b = d.boundingbox + if b then + local llx = b[1] + if llx < 0 then + return - llx + end + end + end + return false + end + for u, c in next, targetcharacters do + local uc = c.unicode or u + if integrals[uc] then + -- skip this one + else + local accent = c.top_accent + local italic = c.italic + local width = c.width or 0 + local llx = getllx(u) + local bl, br, tl, tr + if llx then + llx = llx * factor + width = width + llx + bl = - llx + tl = bl + c.commands = { { "right", llx }, { "slot", 0, u } } + if accent then + accent = accent + llx + end + end + if accent then + if italics[uc] then + c.top_accent = accent + else + c.top_accent = nil + end + end + if italic and italic ~= 0 then + width = width + italic + br = - italic + end + c.width = width + if italic then + c.italic = nil + end + if bl or br or tl or tr then + -- watch out: singular and _ because we are post copying / scaling + c.mathkern = { + bottom_left = bl and { { height = 0, kern = bl } } or nil, + bottom_right = br and { { height = 0, kern = br } } or nil, + top_left = tl and { { height = c.height or 0, kern = tl } } or nil, + top_right = tr and { { height = c.height or 0, kern = tr } } or nil, + } + end + end + end + tfmdata.fonts = { { id = 0 } } + tfmdata.type = "virtual" + tfmdata.properties.virtualized = true + tfmdata.emulatedlmtx = true + end +end + +fonts.handlers.otf.features.register { + name = "emulate lmtx", + description = "emulate lmtx mode", + default = emulate, + manipulators = { base = emulatelmtx }, +} -- cgit v1.2.3