diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkxl/file-mod.mklx')
-rw-r--r-- | Master/texmf-dist/tex/context/base/mkxl/file-mod.mklx | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkxl/file-mod.mklx b/Master/texmf-dist/tex/context/base/mkxl/file-mod.mklx new file mode 100644 index 00000000000..24471e30f00 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/mkxl/file-mod.mklx @@ -0,0 +1,262 @@ +%D \module +%D [ file=file-mod, % was core-fil, +%D version=20110701, % 1997.11.15, +%D title=\CONTEXT\ File Macros, +%D subtitle=Module Support, +%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. + +\writestatus{loading}{ConTeXt File Macros / Modules} + +\unprotect + +\registerctxluafile{file-mod}{autosuffix} + +%D \macros +%D {usemodule} +%D +%D Most of \CONTEXT is preloaded in the format file. Some very domain specific +%D typesetting topics are however dealt with in separate modules, e.g. typesetting +%D of chemical structure formulas. These modules are loaded by: +%D +%D \showsetup{usemodule} +%D +%D More information on the specific modules can be found in their dedicated manuals. +%D We use \type {\next} so that we can \type {\end} in modules. + +\installcorenamespace{module} + +\mutable\let\currentmodule \s!unknown +\mutable\let\currentmodulecategory \empty +\mutable\let\currentmoduleparameters\empty + +\installmacrostack\currentmodule +\installmacrostack\currentmodulecategory +\installmacrostack\currentmoduleparameters + +\permanent\tolerant\protected\def\usemodules[#category]#spacer[#name]#spacer[#parameters]% category=t|m|x|p|... + {\push_macro_currentmodule + \push_macro_currentmodulecategory + \push_macro_currentmoduleparameters + \ifparameters + \let\currentmodule\empty + \or + \let \currentmodulecategory \empty + \edef\currentmodule {#category}% + \let \currentmoduleparameters\empty + \or + \ifhastok={#name}% + \let\currentmodulecategory \empty + \edef\currentmodule {#category}% + \edef\currentmoduleparameters{#name}% + \else + \edef\currentmodulecategory {#category}% + \edef\currentmodule {#name}% + \let \currentmoduleparameters\empty + \fi + \or + \edef\currentmodulecategory {#category}% + \edef\currentmodule {#name}% + \def \currentmoduleparameters{#parameters}% + \fi + \processcommacommand[\currentmodule]{\strc_modules_use\currentmodulecategory}% + \pop_macro_currentmoduleparameters + \pop_macro_currentmodulecategory + \pop_macro_currentmodule} + +\def\strc_modules_use#category#name% + {\ifempty\currentmoduleparameters\else + \scratchtoks\expandafter{\currentmoduleparameters}% + \normalexpanded{\getparameters[\??module#name:][\the\scratchtoks]}% + \fi + \clf_usemodules{#category}{#name}} + +\aliased\let\usemodule \usemodules +\aliased\let\usetexmodule\usemodules + +\newcount\c_syst_modules_nesting +\newtoks \everysetupmodule + +\permanent\tolerant\protected\def\startmodule[#1]#;#2 % + {\global\advance\c_syst_modules_nesting\plusone + \push_macro_currentmodule + \push_macro_currentmoduleparameters + \def\currentmodule{#1#2}} + +\permanent\protected\def\stopmodule + {\ifcase\c_syst_modules_nesting + \writestatus\m!system{module wrapping error in '\currentmodule'}% + \else + \pop_macro_currentmoduleparameters + \pop_macro_currentmodule + \global\advance\c_syst_modules_nesting\minusone + \fi} + +\permanent\protected\def\setupmodule % to be lmtx'd + {\ifempty\currentmoduleparameters + \expandafter\syst_modules_setup_nop + \else + \expandafter\syst_modules_setup_yes + \fi} + +\tolerant\def\syst_modules_setup_nop[#name]#spacer[#parameters]% + {\ifarguments + % nothing + \or + \doifassignmentelse{#name}{\getparameters[\??module\currentmodule:][#name]}\donothing + \or + \getparameters[\??module#name:][#parameters]% internal (defaults) + \fi + \the\everysetupmodule} + +\tolerant\def\syst_modules_setup_yes[#name]#spacer[#parameters]% + {\scratchtoks\expandafter{\currentmoduleparameters}% + \ifparameters + \normalexpanded{\getparameters[\??module\currentmodule:][\the\scratchtoks]}% + \or + \ifhastok={#name}% + \getparameters[\??module\currentmodule:][#name]% internal (defaults) + \normalexpanded{\getparameters[\??module\currentmodule:][\the\scratchtoks]}% loadtime (user) + \else + \normalexpanded{\getparameters[\??module#1:][\the\scratchtoks]}% loadtime (user) + \fi + \or + \getparameters[\??module#name:][#parameters]% internal (defaults) + \normalexpanded{\getparameters[\??module#name:][\the\scratchtoks]}% loadtime (user) + \fi + \let\currentmoduleparameters\empty + \the\everysetupmodule} + +\permanent\def\moduleparameter#name#parameter% should have been \namedmoduleparameter + {\begincsname\??module#name:#parameter\endcsname} + +\letvalue\??module\empty % so we default to empty as with all parameters + +\permanent\def\currentmoduleparameter{\moduleparameter\currentmodule} % no need for inlining + +%permanent\protected\def\useluamodule[#name]{\clf_loadluamodule{#1}} % why not use useluamodule + +\permanent\protected\def\useluamodule [#name]{\clf_useluamodule{#1}} +\permanent\protected\def\luaenvironment #name {\clf_loadluamodule{#1}} + +% \usemodule[newmml] +% \usemodule[newmml][a=b] +% \usemodule[x][newmml] +% \usemodule[x][newmml][a=b] +% +% \startmodule [mathml] +% \setupmodule[a=c] \relax [\currentmoduleparameter{a}] % user vars will be set afterwards +% \setupmodule[a=c] \relax [\currentmoduleparameter{a}] % user vars are now forgotten +% \stopmodule + +% one can introduce test sections with: +% +% \enablemode[newmml:test:\currentmoduleparameter{test}] +% \startmode[newmml:test:yes} ... \stopmode +% +% these will be ignored unless test=yes +% +% however, a better way is: + +\permanent\protected\def\startmoduletestsection + {\begingroup + \setupmodule % we need to make sure that the vars are set + \doifelse{\currentmoduleparameter\v!test}\v!yes + {\endgroup + \writestatus\currentmodule{loading experimental code}} + {\endgroup + \writestatus\currentmodule{skipping experimental code}% + \gobbleuntil\stopmoduletestsection}} + +\aliased\let\stopmoduletestsection\donothing + +% will become file-run + +%D \macros +%D {doifolderversionelse} +%D +%D We start with a macro specially for Aditya who wants to be able +%D to use development versions of \MKIV\ for real documents. +%D +%D \starttyping +%D \doifolderversionelse\contextversion{1010.10.10} {OLDER} {OKAY} => OLDER +%D \doifolderversionelse\contextversion{2020.20.20} {OLDER} {OKAY} => OKAY +%D \doifolderversionelse\contextversion{2020} {OLDER} {OKAY} => OKAY +%D \stoptyping +%D +%D The version pattern is \type {yyyy.mm.dd} (with mm and dd being optional). + +\permanent\protected\def\doifelseolderversion#parent#child{\clf_doifelseolderversion{#parent}{#child}} +\permanent\protected\def\doifelseoldercontext #child{\clf_doifelseolderversion{#child}{}} + +\aliased\let\doifolderversionelse\doifelseolderversion +\aliased\let\doifoldercontextelse\doifelseoldercontext + +%D Relatively new (no need for a speedup here). Can't this now be done nicer? + +\permanent\protected\def\syst_modules_direct_lua#1#2% + {\edef\m_module_command_command {#1}% + \edef\m_module_command_function{#2}% + \directsetup{module:\m_module_command_command:start}% + \ctxlua{\m_module_command_function()}% + \directsetup{module:\m_module_command_command:stop}} + +\permanent\protected\def\syst_modules_single_lua#1#2% + {\edef\m_module_command_command {#1}% + \edef\m_module_command_function{#2}% + \dosingleempty\syst_modules_single_lua_indeed} + +\permanent\protected\def\syst_modules_single_lua_indeed[#1]% + {\directsetup{module:\m_module_command_command:start}% + \ctxlua{\m_module_command_function(\!!bs#1\!!es)}% + \directsetup{module:\m_module_command_command:stop}} + +\permanent\protected\def\syst_modules_double_lua#1#2% + {\edef\m_module_command_command {#1}% + \edef\m_module_command_function{#2}% + \dodoubleempty\syst_modules_double_lua_indeed} + +\permanent\protected\def\syst_modules_double_lua_indeed[#1][#2]% + {\directsetup{module:\m_module_command_command:start}% + \ctxlua{\m_module_command_function(\!!bs#1\!!es,\!!bs#2\!!es)}% + \directsetup{module:\m_module_command_command:stop}} + +\permanent\protected\def\installmodulecommandlua #1#2{\enforced\permanent\protected\def#1{\normalexpanded{\syst_modules_direct_lua{\csstring#1}{#2}}}} +\permanent\protected\def\installmodulecommandluasingle#1#2{\enforced\permanent\protected\def#1{\normalexpanded{\syst_modules_single_lua{\csstring#1}{#2}}}} +\permanent\protected\def\installmodulecommandluadouble#1#2{\enforced\permanent\protected\def#1{\normalexpanded{\syst_modules_double_lua{\csstring#1}{#2}}}} + +\protected\def\syst_modules_one_lua#1#2#3% + {\directsetup{module:#1:start}% + \ctxlua{#2(\!!bs#3\!!es)}% + \directsetup{module:#1:stop}} + +\protected\def\syst_modules_two_lua#1#2#3#4% + {\directsetup{module:#1:start}% + \ctxlua{#2(\!!bs#3\!!es,\!!bs#4\!!es)}% + \directsetup{module:#1:stop}} + +\permanent\protected\def\installmodulecommandluaone#1#2{\enforced\permanent\protected\def#1{\normalexpanded{\syst_modules_one_lua{\csstring#1}{#2}}}} +\permanent\protected\def\installmodulecommandluatwo#1#2{\enforced\permanent\protected\def#1{\normalexpanded{\syst_modules_two_lua{\csstring#1}{#2}}}} + +%D This replaces \type {\fetchruntimecommand}: +%D +%D \starttyping +%D \fetchmodulecommand \csname {module} +%D \stoptyping + +\permanent\protected\def\fetchmodulecommand#1#2% + {\mutable\protected\def#1{\syst_fetch_module_command#1{#2}}} + +\def\syst_fetch_module_command#1#2% actually a test on #1 being define would be ok as well + {%writestatus\m!systems{fetching \string#1}% + \usemodule[#2]% + #1} + +\aliased\let\fetchruntimecommand\fetchmodulecommand % obsolete + +\protect \endinput |