From 590f92a6661f059e1c49b7b453c6c43149865628 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 17 Jan 2019 21:28:23 +0000 Subject: fontspec (17jan19) git-svn-id: svn://tug.org/texlive/trunk@49739 c570f23f-e606-0410-a88d-b1316a301751 --- .../latex/fontspec/fontspec-code-feat-opentype.dtx | 45 ++++++------ .../latex/fontspec/fontspec-code-internal.dtx | 80 ++++++++++++++-------- .../source/latex/fontspec/fontspec-code-keyval.dtx | 2 + .../source/latex/fontspec/fontspec-code-msg.dtx | 4 ++ .../latex/fontspec/fontspec-code-opentype.dtx | 39 ++++++++--- .../source/latex/fontspec/fontspec-code-vars.dtx | 16 ++++- .../source/latex/fontspec/fontspec-doc-api.tex | 9 +++ .../texmf-dist/source/latex/fontspec/fontspec.dtx | 6 +- 8 files changed, 135 insertions(+), 66 deletions(-) (limited to 'Master/texmf-dist/source/latex/fontspec') diff --git a/Master/texmf-dist/source/latex/fontspec/fontspec-code-feat-opentype.dtx b/Master/texmf-dist/source/latex/fontspec/fontspec-code-feat-opentype.dtx index 843e4587740..dc3db933869 100644 --- a/Master/texmf-dist/source/latex/fontspec/fontspec-code-feat-opentype.dtx +++ b/Master/texmf-dist/source/latex/fontspec/fontspec-code-feat-opentype.dtx @@ -424,34 +424,37 @@ { \keys_define:nn { fontspec-opentype } { Script / #1 .code:n = { - \bool_set_false:N \l_@@_scriptlang_exist_bool - \clist_map_inline:nn {#2} + \bool_if:NF \l_@@_scripts_missing_bool { - \@@_check_script:NnT \l_fontspec_font {####1} + \bool_set_false:N \l_@@_scriptlang_exist_bool + \clist_map_inline:nn {#2} { - \tl_set:Nn \l_fontspec_script_tl {####1} - \int_set:Nn \l_@@_script_int {\l_@@_strnum_int} - \bool_set_true:N \l_@@_scriptlang_exist_bool - \tl_gset:Nx \g_@@_single_feat_tl { script=####1 } - \clist_map_break: - } - } - \bool_if:NF \l_@@_scriptlang_exist_bool - { - \str_if_eq:eeTF {#1} {Latin} - { - \@@_warning:nx {script-not-exist} {#1} - } - { - \@@_check_script:NnTF \l_fontspec_font {latn} + \@@_check_script:NnT \l_fontspec_font {####1} { - \@@_warning:nx {script-not-exist-latn} {#1} - \tl_set:Nn \l_fontspec_script_tl {latn} + \tl_set:Nn \l_fontspec_script_tl {####1} \int_set:Nn \l_@@_script_int {\l_@@_strnum_int} + \bool_set_true:N \l_@@_scriptlang_exist_bool + \tl_gset:Nx \g_@@_single_feat_tl { script=####1 } + \clist_map_break: } + } + \bool_if:NF \l_@@_scriptlang_exist_bool + { + \str_if_eq:eeTF {#1} {Latin} { \@@_warning:nx {script-not-exist} {#1} - \keys_set:nn {fontspec-opentype} { Script = Default } + } + { + \@@_check_script:NnTF \l_fontspec_font {latn} + { + \@@_warning:nx {script-not-exist-latn} {#1} + \tl_set:Nn \l_fontspec_script_tl {latn} + \int_set:Nn \l_@@_script_int {\l_@@_strnum_int} + } + { + \@@_warning:nx {script-not-exist} {#1} + \keys_set:nn {fontspec-opentype} { Script = Default } + } } } } diff --git a/Master/texmf-dist/source/latex/fontspec/fontspec-code-internal.dtx b/Master/texmf-dist/source/latex/fontspec/fontspec-code-internal.dtx index da2374cde13..d73f0f62b18 100644 --- a/Master/texmf-dist/source/latex/fontspec/fontspec-code-internal.dtx +++ b/Master/texmf-dist/source/latex/fontspec/fontspec-code-internal.dtx @@ -239,6 +239,15 @@ \@@_primitive_font_gset:Nnn \l_fontspec_font { \@@_construct_font_call:nn { \l_@@_fontname_up_tl } {} } {\f@size pt} \l_fontspec_font % this is necessary for LuaLaTeX to check the scripts properly + \@@_check_script:NnTF \l_fontspec_font {DFLT} + { +%\typeout{Has~Opentype~scripts} + \bool_set_false:N \l_@@_scripts_missing_bool + } + { +%\typeout{No~Opentype~scripts} + \bool_set_true:N \l_@@_scripts_missing_bool + } } % \end{macrocode} % \end{macro} @@ -304,33 +313,42 @@ % \typeout{:: _set_scriptlang:} \bool_if:NT \l_@@_firsttime_bool { - \tl_if_empty:NTF \l_@@_script_name_tl + \bool_if:NTF \l_@@_scripts_missing_bool { - \@@_check_script:NnTF \l_fontspec_font {latn} +% \typeout{:::: NADA} + \@@_info:n {no-scripts} + } + { + \tl_if_empty:NTF \l_@@_script_name_tl + { + \@@_check_script:NnTF \l_fontspec_font {latn} + { +% \typeout{:::: Defaulting to latn script} + \tl_set:Nn \l_@@_script_name_tl {Latin} + \tl_if_empty:NT \l_@@_lang_name_tl + { + \tl_set:Nn \l_@@_lang_name_tl {Default} + } + \keys_set:nx {fontspec-opentype} {Script=\l_@@_script_name_tl} + \keys_set:nx {fontspec-opentype} {Language=\l_@@_lang_name_tl} +% \typeout{:::: Script=\l_@@_script_name_tl, Language=\l_@@_lang_name_tl} + } + { +% \typeout{:::: Default script only} + \@@_info:n {dflt-script} + \keys_set:nx {fontspec-opentype} {Script=Default} + \keys_set:nx {fontspec-opentype} {Language=Default} + } + } { - \tl_set:Nn \l_@@_script_name_tl {Latin} \tl_if_empty:NT \l_@@_lang_name_tl { \tl_set:Nn \l_@@_lang_name_tl {Default} } +% \typeout{:::: Script=\l_@@_script_name_tl, Language=\l_@@_lang_name_tl} \keys_set:nx {fontspec-opentype} {Script=\l_@@_script_name_tl} \keys_set:nx {fontspec-opentype} {Language=\l_@@_lang_name_tl} -% \typeout{:::: Script=\l_@@_script_name_tl, Language=\l_@@_lang_name_tl} } - { -% \typeout{:::: NADA} - \@@_info:n {no-scripts} - \bool_set_true:N \l_@@_never_check_bool - } - } - { - \tl_if_empty:NT \l_@@_lang_name_tl - { - \tl_set:Nn \l_@@_lang_name_tl {Default} - } -% \typeout{:::: Script=\l_@@_script_name_tl, Language=\l_@@_lang_name_tl} - \keys_set:nx {fontspec-opentype} {Script=\l_@@_script_name_tl} - \keys_set:nx {fontspec-opentype} {Language=\l_@@_lang_name_tl} } } } @@ -1138,25 +1156,31 @@ \int_compare:nT { \tl_count:n {#6} > 2 } { \@@_error:nx {ot-tag-too-long} {#2#3#4#5#6} } - \str_if_eq:eeTF {#2#3#4#5#6} {DFLT} - { \int_zero:N #1 } + \int_set:Nn #1 { - \int_set:Nn #1 - { - `#2 * "1000000 - + `#3 * "10000 - + \ifx \c_empty_tl #4 32 \else `#4 \fi * "100 - + \ifx \c_empty_tl #5 32 \else `#5 \fi - } + `#2 * "1000000 + + `#3 * "10000 + + \ifx \c_empty_tl #4 32 \else `#4 \fi * "100 + + \ifx \c_empty_tl #5 32 \else `#5 \fi } } % \end{macrocode} % % \begin{macrocode} -\cs_generate_variant:Nn \@@_iv_str_to_num:Nn {No} +% % \end{macrocode} +% \end{macro} % +% \begin{macro}{\@@_lang_dflt_correct:N} % \begin{macrocode} +%<*XE> +\cs_new_protected:Nn \@@_lang_dflt_correct:N + { + \int_compare:nNnT {#1} = {1145457748} % "DFLT" + { + \int_zero:N #1 + } + } % % \end{macrocode} % \end{macro} diff --git a/Master/texmf-dist/source/latex/fontspec/fontspec-code-keyval.dtx b/Master/texmf-dist/source/latex/fontspec/fontspec-code-keyval.dtx index 1adee94c741..2aa33288fe4 100644 --- a/Master/texmf-dist/source/latex/fontspec/fontspec-code-keyval.dtx +++ b/Master/texmf-dist/source/latex/fontspec/fontspec-code-keyval.dtx @@ -105,6 +105,7 @@ { \int_case:nn \l_keys_choice_int { 1 {/AAT} 2 {/OT} 3 {/OT} 4 {/GR} } } +%\typeout{Renderer: \l_fontspec_renderer_tl} \tl_gset:Nx \g_@@_single_feat_tl { \l_fontspec_renderer_tl } % %<*LU> @@ -120,6 +121,7 @@ { \int_case:nn \l_keys_choice_int { 5 {node} 6 {base} } } +%\typeout{Mode: \l_fontspec_mode_tl} \tl_gset:Nx \g_@@_single_feat_tl { mode=\l_fontspec_mode_tl } % } diff --git a/Master/texmf-dist/source/latex/fontspec/fontspec-code-msg.dtx b/Master/texmf-dist/source/latex/fontspec/fontspec-code-msg.dtx index 42b02254808..f80ea832584 100644 --- a/Master/texmf-dist/source/latex/fontspec/fontspec-code-msg.dtx +++ b/Master/texmf-dist/source/latex/fontspec/fontspec-code-msg.dtx @@ -239,6 +239,10 @@ { Font "\l_fontspec_fontname_tl" does not contain any OpenType `Script' information. } +\@@_msg_new:nnn {fontspec} {dflt-script} + { + Font "\l_fontspec_fontname_tl" falling back to default (DFLT) script. + } \@@_msg_new:nnn {fontspec} {opa-twice} { Opacity set twice, in both Colour and Opacity.\\ diff --git a/Master/texmf-dist/source/latex/fontspec/fontspec-code-opentype.dtx b/Master/texmf-dist/source/latex/fontspec/fontspec-code-opentype.dtx index ceda070f907..57087ce8a82 100644 --- a/Master/texmf-dist/source/latex/fontspec/fontspec-code-opentype.dtx +++ b/Master/texmf-dist/source/latex/fontspec/fontspec-code-opentype.dtx @@ -149,10 +149,12 @@ % \begin{macrocode} \prg_new_conditional:Nnn \@@_check_script:Nn {TF,T} { +%\typeout{:: _check_script:Nn} \bool_if:NTF \l_@@_never_check_bool { \prg_return_true: } %<*XE> { +%\typeout{::::~ checking~ script~ #2} \@@_iv_str_to_num:Nx \l_@@_strnum_int {#2} \int_set:Nn \l_tmpb_int { \XeTeXOTcountscripts #1 } \int_zero:N \l_tmpa_int @@ -175,8 +177,17 @@ \cs_if_eq:NNTF #1 \font { \tl_set:Nx \l_@@_tmp_tl {\curr@fontshape/\f@size} } { \tl_set:Nx \l_@@_tmp_tl {\cs_to_str:N #1} } +%\typeout{::::~ checking:~"\l_@@_tmp_tl",~ "#2"} \directlua{fontspec.check_ot_script("\l_@@_tmp_tl", "#2")} - \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false: + \bool_if:NTF \l__fontspec_check_bool + { +%\typeout{::::::~ TRUE} + \prg_return_true: + } + { +%\typeout{::::::~ FALSE} + \prg_return_false: + } } % } @@ -206,18 +217,23 @@ { \@@_iv_str_to_num:Nx \l_@@_strnum_int {#2} \@@_iv_str_to_num:Nx \l_@@_script_int {#3} - \int_set:Nn \l_tmpb_int + \int_set:Nn \l_@@_tmpb_int { \XeTeXOTcountlanguages #1 \l_@@_script_int } - \int_zero:N \l_tmpa_int + \int_zero:N \l_@@_tmpa_int \bool_set_false:N \l__fontspec_check_bool - \bool_until_do:nn { \int_compare_p:nNn \l_tmpa_int = \l_tmpb_int } + \bool_until_do:nn { \int_compare_p:nNn \l_@@_tmpa_int = \l_@@_tmpb_int } { - \ifnum\XeTeXOTlanguagetag #1 \l_@@_script_int \l_tmpa_int = \l_@@_strnum_int - \bool_set_true:N \l__fontspec_check_bool - \int_set:Nn \l_tmpa_int {\l_tmpb_int} - \else - \int_incr:N \l_tmpa_int - \fi + \int_set:Nn \l_@@_tmpc_int + { \XeTeXOTlanguagetag #1 \l_@@_script_int \l_@@_tmpa_int } + + \int_compare:nNnTF \l_@@_tmpc_int = \l_@@_strnum_int + { + \bool_set_true:N \l__fontspec_check_bool + \int_set:Nn \l_@@_tmpa_int {\l_@@_tmpb_int} + } + { + \int_incr:N \l_@@_tmpa_int + } } \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false: } @@ -260,13 +276,14 @@ % \begin{macrocode} \prg_new_conditional:Nnn \@@_check_ot_feat:Nnnn {TF,F} { - \bool_if:NTF \l_@@_never_check_bool + \bool_if:nTF {\l_@@_never_check_bool || \l_@@_scripts_missing_bool} { \prg_return_true: } %<*XE> { %\typeout{::~ fontspec_check_ot_feat:nnn~ {#2}{#3}{#4}} \@@_iv_str_to_num:Nx \l_@@_strnum_int {#2} \@@_iv_str_to_num:Nx \l_@@_language_int {#3} + \@@_lang_dflt_correct:N \l_@@_language_int \@@_iv_str_to_num:Nx \l_@@_script_int {#4} \int_set:Nn \l_tmpb_int { diff --git a/Master/texmf-dist/source/latex/fontspec/fontspec-code-vars.dtx b/Master/texmf-dist/source/latex/fontspec/fontspec-code-vars.dtx index bdd970f3674..db0223739ae 100644 --- a/Master/texmf-dist/source/latex/fontspec/fontspec-code-vars.dtx +++ b/Master/texmf-dist/source/latex/fontspec/fontspec-code-vars.dtx @@ -67,9 +67,8 @@ % \end{macrocode} % % \begin{macro}{\l_@@_never_check_bool} -% This boolean is overloaded. It is used to disable checking opentype script, language, and tags -% for two purposes: when a font has no opentype features, we just turn it true (i.e., disable checking); -% and, when running checking code that has a user-defined return path we want to allow the higher-level +% It is used to disable checking opentype script, language, and tags +% when running checking code that has a user-defined return path we want to allow the higher-level % code to dictate the logic. % TODO: tidy this up! % \begin{macrocode} @@ -77,12 +76,23 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\l_@@_scripts_missing_bool} +% True for a regular opentype font with at least the DFLT script. +% False for a font lacking all script (and therefore language and feature) tags. +% \begin{macrocode} +\bool_new:N \l_@@_scripts_missing_bool +% \end{macrocode} +% \end{macro} +% % \paragraph{Counters} % \begin{macrocode} \int_new:N \l_@@_script_int \int_new:N \l_@@_language_int \int_new:N \l_@@_strnum_int \int_new:N \l_@@_tmp_int +\int_new:N \l_@@_tmpa_int +\int_new:N \l_@@_tmpb_int +\int_new:N \l_@@_tmpc_int \int_new:N \l_@@_em_int \int_new:N \l_@@_emdef_int \int_new:N \l_@@_strong_int diff --git a/Master/texmf-dist/source/latex/fontspec/fontspec-doc-api.tex b/Master/texmf-dist/source/latex/fontspec/fontspec-doc-api.tex index 766b3527a07..41d1ada2876 100644 --- a/Master/texmf-dist/source/latex/fontspec/fontspec-doc-api.tex +++ b/Master/texmf-dist/source/latex/fontspec/fontspec-doc-api.tex @@ -87,6 +87,15 @@ tag. The advantage to using these commands rather than \cmd\newfontfeature\ (see \vref{sec:newfeatures}) is the error-checking that is performed when the script or language is requested. +Both commands accept a comma-separated list of OpenType tags in order of preference. +This permits, for example, supporting both new and old versions of a language tag with +a common user interface: +\begin{Verbatim} + \newfontlanguage{Turkish}{TRK,TUR} +\end{Verbatim} +Here, a font that is requested with \verb|Script=Turkish| will first be checked for the +OpenType language tag \verb|TRK|, which will be selected if available. If not available, +the \verb|TUR| tag will be queried and used if possible as a fallback. \section{Going behind \pkg{fontspec}'s back} diff --git a/Master/texmf-dist/source/latex/fontspec/fontspec.dtx b/Master/texmf-dist/source/latex/fontspec/fontspec.dtx index e3c5e01bde8..8f9606fc750 100644 --- a/Master/texmf-dist/source/latex/fontspec/fontspec.dtx +++ b/Master/texmf-dist/source/latex/fontspec/fontspec.dtx @@ -71,7 +71,7 @@ \ProvidesExplFile{fontspec.dtx} % %<*fontspec> - {2019/01/16}{2.6k}{Font selection for XeLaTeX and LuaLaTeX} + {2019/01/18}{2.6l}{Font selection for XeLaTeX and LuaLaTeX} % % \end{macrocode} % @@ -90,8 +90,8 @@ %local fontspec = fontspec %fontspec.module = { % name = "fontspec", -% version = "2.6k", -% date = "2019/01/16", +% version = "2.6l", +% date = "2019/01/18", % description = "Font selection for XeLaTeX and LuaLaTeX", % author = "Khaled Hosny, Philipp Gesang, Will Robertson", % copyright = "Khaled Hosny, Philipp Gesang, Will Robertson", -- cgit v1.2.3