diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/fontspec/fontspec-opentype.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/fontspec/fontspec-opentype.dtx | 395 |
1 files changed, 395 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/fontspec/fontspec-opentype.dtx b/Master/texmf-dist/source/latex/fontspec/fontspec-opentype.dtx new file mode 100644 index 00000000000..cf655be78b2 --- /dev/null +++ b/Master/texmf-dist/source/latex/fontspec/fontspec-opentype.dtx @@ -0,0 +1,395 @@ +% \section{OpenType definitions code} +% +% \iffalse +% \begin{macrocode} +%<*fontspec&(xetexx|luatex)> +% \end{macrocode} +% \fi +% +% +% +% \begin{macro}{\@@_define_opentype_feature_group:n} +% \begin{macrocode} +\cs_new:Nn \@@_define_opentype_feature_group:n + { + \keys_define:nn {fontspec-opentype} { #1 .multichoice: } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_define_opentype_feature:nnnnn} +% \darg{Feature key} +% \darg{Feature option val} +% \darg{Check feature --- leave empty for no check} +% \darg{Exact tag string to activate --- leave empty for disable only} +% \darg{Tags to remove (clist)} +% \begin{macrocode} +\cs_new:Nn \@@_feat_prop_add:nn + { + \tl_if_empty:nF {#1} + { + \prop_if_in:NnF \g_@@_OT_features_prop {#1} + { + \prop_gput:Nnn \g_@@_OT_features_prop {#1} {#2} + } + } + } +\cs_new:Nn \@@_define_opentype_feature:nnnnn + { + \@@_feat_prop_add:nn {#3} {#1\,=\,#2} + \keys_define:nn {fontspec-opentype} + { + #1/#2 .code:n = { \@@_make_OT_feature:nnn {#3} {#4} {#5} } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_define_opentype_onoffreset:nnnnn} +% \darg{Feature key} +% \darg{Feature option val} +% \darg{Check feature} +% \darg{Tag prefix to activate: \texttt{+\#4} = on, \texttt{-\#4} = off.} +% \darg{Tags to remove in the on case (clist)} +% \begin{macrocode} +\cs_new:Nn \@@_feat_off:n {#1Off} +\cs_new:Nn \@@_feat_reset:n {#1Reset} +% \end{macrocode} +% +% \begin{macrocode} +\cs_new:Nn \@@_define_opentype_onoffreset:nnnnn + { + \exp_args:Nnx \@@_define_opentype_feature:nnnnn {#1} {#2} {#3} {+#4} {#5} + \exp_args:Nnx \@@_define_opentype_feature:nnnnn {#1} { \@@_feat_off:n {#2} } {#3} {-#4} {} + \exp_args:Nnx \@@_define_opentype_feature:nnnnn {#1} { \@@_feat_reset:n {#2} } {} {} {+#4,-#4} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_define_opentype_onreset:nnnnn} +% \darg{Feature key} +% \darg{Feature option val} +% \darg{Check feature} +% \darg{Exact tag string to activate} +% \darg{Tags to remove (clist)} +% \begin{macrocode} +\cs_new:Nn \@@_define_opentype_onreset:nnnnn + { + \exp_args:Nnx \@@_define_opentype_feature:nnnnn {#1} {#2} {#3} {#4} {#5} + \exp_args:Nnx \@@_define_opentype_feature:nnnnn {#1} { \@@_feat_reset:n {#2} } {} {} {#4} + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Adding features when loading fonts} +% +% When remove clashing features, +% \begin{enumerate} +% \item remove the feature being added (to avoid duplicates); +% \item remove the inverse of the feature (to avoid cancellation); +% \item finally remove all clashing features. +% \end{enumerate} +% \begin{macrocode} +\cs_new:Nn \@@_make_OT_feature:nnn + { +%<debug> \typeout{:: @@_make_OT_feature:nnn \exp_not:n { {#1}{#2}{#3} } } + + \bool_set_true:N \l_@@_proceed_bool + \bool_set_true:N \l_@@_check_feat_bool + + \tl_if_empty:nT {#1} { \bool_set_false:N \l_@@_check_feat_bool } + \bool_if:NT \l_@@_check_feat_bool + { + \@@_check_ot_feat:nF {#1} + { + \@@_warning:nx {icu-feature-not-exist-in-font} {#1} + \bool_set_false:N \l_@@_proceed_bool + } + } + + \bool_if:NT \l_@@_proceed_bool + { + \exp_args:Nx \@@_remove_clashing_featstr:n + { #2 , \@@_swap_plus_minus:n {#2} , #3 } + + \@@_update_featstr:n {#2} + } + } +\cs_generate_variant:Nn \@@_make_OT_feature:nnn {xxx} +% \end{macrocode} +% +% \begin{macrocode} +\cs_new:Nn \@@_swap_plus_minus:n { \@@_swap_plus_minus_aux:NNNNN #1 } +\cs_new:Nn \@@_swap_plus_minus_aux:NNNNN + { \str_case:nn {#1} { {+} {-#2#3#4#5} {-} {+#2#3#4#5} } } +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@@_check_script:nTF} +% This macro takes an OpenType script tag and checks if it exists in the current +% font. The output boolean is \cmd\@tempswatrue. \cmd\l_@@_script_int\ is used to store +% the number corresponding to the script tag string. +% \begin{macrocode} +\prg_new_conditional:Nnn \@@_check_script:n {TF} + { + \bool_if:NTF \l_@@_never_check_bool + { \prg_return_true: } +%<*xetexx> + { + \@@_iv_str_to_num:Nn \l_@@_strnum_int {#1} + \int_set:Nn \l_tmpb_int { \XeTeXOTcountscripts \l_fontspec_font } + \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 } + { + \ifnum \XeTeXOTscripttag\l_fontspec_font \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 + } + \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false: + } +%</xetexx> +%<*luatex> + { + \directlua{fontspec.check_ot_script("l_fontspec_font", "#1")} + \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false: + } +%</luatex> + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_check_lang:nTF} +% This macro takes an OpenType language tag and checks if it exists in the current +% font/script. The output boolean is \cmd\@tempswatrue. \cmd\l_@@_language_int\ is used to store +% the number corresponding to the language tag string. +% The script used is whatever's held in \cmd\l_@@_script_int. By default, that's the +% number corresponding to `|latn|'. +% \begin{macrocode} +\prg_new_conditional:Nnn \@@_check_lang:n {TF} + { + \bool_if:NTF \l_@@_never_check_bool + { \prg_return_true: } +%<*xetexx> + { + \@@_iv_str_to_num:Nn \l_@@_strnum_int {#1} + \int_set:Nn \l_tmpb_int + { \XeTeXOTcountlanguages \l_fontspec_font \l_@@_script_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 } + { + \ifnum\XeTeXOTlanguagetag\l_fontspec_font\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 + } + \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false: + } +%</xetexx> +%<*luatex> + { + \directlua + { + fontspec.check_ot_lang( "l_fontspec_font", "#1", "\l_fontspec_script_tl" ) + } + \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false: + } +%</luatex> + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_check_ot_feat:nTF} +% This macro takes an OpenType feature tag and checks if it exists in the current +% font/script/language. +% \cmd\l_@@_strnum_int\ is used to store the number corresponding to the feature tag string. +% The script used is whatever's held in \cmd\l_@@_script_int. By default, that's the +% number corresponding to `|latn|'. The language used is \cmd\l_@@_language_int, +% by default |0|, the `default language'. +% \begin{macrocode} +\prg_new_conditional:Nnn \@@_check_ot_feat:n {TF,F} + { + \bool_if:NTF \l_@@_never_check_bool + { \prg_return_true: } +%<*xetexx> + { +%<debug>\typeout{::~ fontspec_check_ot_feat:n~ {#1}} + \int_set:Nn \l_tmpb_int + { + \XeTeXOTcountfeatures \l_fontspec_font + \l_@@_script_int + \l_@@_language_int + } + \@@_iv_str_to_num:Nn \l_@@_strnum_int {#1} + \int_zero:N \l_tmpa_int + \bool_set_false:N \l_@@_check_bool + \bool_until_do:nn { \int_compare_p:nNn \l_tmpa_int = \l_tmpb_int } + { + \ifnum\XeTeXOTfeaturetag\l_fontspec_font\l_@@_script_int\l_@@_language_int + \l_tmpa_int =\l_@@_strnum_int + \bool_set_true:N \l_@@_check_bool + \int_set:Nn \l_tmpa_int {\l_tmpb_int} + \else + \int_incr:N \l_tmpa_int + \fi + } + \bool_if:NTF \l_@@_check_bool \prg_return_true: \prg_return_false: + } +%</xetexx> +%<*luatex> + { +%<debug>\typeout{::~ fontspec_check_ot_feat:n~ {#1}} + \directlua + { + fontspec.check_ot_feat( + "l_fontspec_font", "#1", + "\l_fontspec_lang_tl", "\l_fontspec_script_tl" + ) + } + \bool_if:NTF \l_@@_check_bool \prg_return_true: \prg_return_false: + } +%</luatex> + } +% \end{macrocode} +% \end{macro} +% +% \subsection{OpenType feature information} +% +% \begin{macrocode} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {aalt}{Access~All~Alternates} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {abvf}{Above-base~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {abvm}{Above-base~Mark~Positioning} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {abvs}{Above-base~Substitutions} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {afrc}{Alternative~Fractions} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {akhn}{Akhands} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {blwf}{Below-base~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {blwm}{Below-base~Mark~Positioning} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {blws}{Below-base~Substitutions} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {calt}{Contextual~Alternates} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {case}{Case-Sensitive~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {ccmp}{Glyph~Composition~/~Decomposition} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {cfar}{Conjunct~Form~After~Ro} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {cjct}{Conjunct~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {clig}{Contextual~Ligatures} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {cpct}{Centered~CJK~Punctuation} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {cpsp}{Capital~Spacing} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {cswh}{Contextual~Swash} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {curs}{Cursive~Positioning} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {cvNN}{Character~Variant~$N$} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {c2pc}{Petite~Capitals~From~Capitals} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {c2sc}{Small~Capitals~From~Capitals} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {dist}{Distances} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {dlig}{Discretionary~Ligatures} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {dnom}{Denominators} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {dtls}{Dotless~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {expt}{Expert~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {falt}{Final~Glyph~on~Line~Alternates} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {fin2}{Terminal~Forms~\#2} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {fin3}{Terminal~Forms~\#3} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {fina}{Terminal~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {flac}{Flattened~accent~forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {frac}{Fractions} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {fwid}{Full~Widths} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {half}{Half~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {haln}{Halant~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {halt}{Alternate~Half~Widths} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {hist}{Historical~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {hkna}{Horizontal~Kana~Alternates} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {hlig}{Historical~Ligatures} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {hngl}{Hangul} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {hojo}{Hojo~Kanji~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {hwid}{Half~Widths} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {init}{Initial~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {isol}{Isolated~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {ital}{Italics} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {jalt}{Justification~Alternates} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {jp78}{JIS78~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {jp83}{JIS83~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {jp90}{JIS90~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {jp04}{JIS2004~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {kern}{Kerning} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {lfbd}{Left~Bounds} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {liga}{Standard~Ligatures} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {ljmo}{Leading~Jamo~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {lnum}{Lining~Figures} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {locl}{Localized~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {ltra}{Left-to-right~alternates} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {ltrm}{Left-to-right~mirrored~forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {mark}{Mark~Positioning} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {med2}{Medial~Forms~\#2} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {medi}{Medial~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {mgrk}{Mathematical~Greek} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {mkmk}{Mark~to~Mark~Positioning} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {mset}{Mark~Positioning~via~Substitution} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {nalt}{Alternate~Annotation~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {nlck}{NLC~Kanji~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {nukt}{Nukta~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {numr}{Numerators} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {onum}{Oldstyle~Figures} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {opbd}{Optical~Bounds} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {ordn}{Ordinals} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {ornm}{Ornaments} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {palt}{Proportional~Alternate~Widths} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {pcap}{Petite~Capitals} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {pkna}{Proportional~Kana} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {pnum}{Proportional~Figures} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {pref}{Pre-Base~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {pres}{Pre-base~Substitutions} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {pstf}{Post-base~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {psts}{Post-base~Substitutions} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {pwid}{Proportional~Widths} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {qwid}{Quarter~Widths} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {rand}{Randomize} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {rclt}{Required~Contextual~Alternates} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {rkrf}{Rakar~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {rlig}{Required~Ligatures} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {rphf}{Reph~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {rtbd}{Right~Bounds} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {rtla}{Right-to-left~alternates} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {rtlm}{Right-to-left~mirrored~forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {ruby}{Ruby~Notation~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {rvrn}{Required~Variation~Alternates} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {salt}{Stylistic~Alternates} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {sinf}{Scientific~Inferiors} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {size}{Optical~size} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {smcp}{Small~Capitals} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {smpl}{Simplified~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {ssNN}{Stylistic~Set~$N$} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {ssty}{Math~script~style~alternates} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {stch}{Stretching~Glyph~Decomposition} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {subs}{Subscript} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {sups}{Superscript} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {swsh}{Swash} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {titl}{Titling} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {tjmo}{Trailing~Jamo~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {tnam}{Traditional~Name~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {tnum}{Tabular~Figures} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {trad}{Traditional~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {twid}{Third~Widths} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {unic}{Unicase} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {valt}{Alternate~Vertical~Metrics} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {vatu}{Vattu~Variants} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {vert}{Vertical~Writing} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {vhal}{Alternate~Vertical~Half~Metrics} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {vjmo}{Vowel~Jamo~Forms} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {vkna}{Vertical~Kana~Alternates} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {vkrn}{Vertical~Kerning} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {vpal}{Proportional~Alternate~Vertical~Metrics} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {vrt2}{Vertical~Alternates~and~Rotation} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {vrtr}{Vertical~Alternates~for~Rotation} +\prop_gput:Nnn \g_@@_all_opentype_feature_names_prop {zero}{Slashed~Zero} +% \end{macrocode} +% +% \iffalse +% \begin{macrocode} +%</fontspec&(xetexx|luatex)> +% \end{macrocode} +% \fi + |