%D \module %D [ file=core-fil, %D version=1997.11.15, %D title=\CONTEXT\ Core Macros, %D subtitle=File Support, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA / Hans Hagen \& Ton Otten}] %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 Core Macros / File Support} \unprotect % NOT YET DOCUMENTED !! % % overal \normalinput \startmessages dutch library: files title: files 1: file synoniem -- is al in gebruik voor -- \stopmessages \startmessages english library: files title: files 1: file synonym -- is already used for -- \stopmessages \startmessages german library: files title: files 1: Dateisynonym -- wird bereits fuer -- benutzt \stopmessages \startmessages czech library: files title: soubory 1: synonymum souboru -- je jiz pouzito pro -- \stopmessages \startmessages italian library: files title: file 1: sinonimo file -- già in uso per -- \stopmessages \startmessages norwegian library: files title: filer 1: filesynonym -- er allerede brukt for -- \stopmessages \startmessages romanian library: files title: fisiere 1: sinonimul fisierelor -- este folosit deja pentru -- \stopmessages %D \macros %D {definefilesynonym} %D %D One of the problems with loading files is that their names %D can depend on the interface language. We therefore need a %D method to define filesynonyms. The actual synonyms are %D defined elsewhere, but look like: %D %D \starttypen %D \definefilesynonym [chemic] [chemie] %D \definefilesynonym [einheit] [eenheid] %D \definefilesynonym [unit] [eenheid] %D \stoptypen %D %D So we can say in english: %D %D \starttypen %D \usemodules[pictex,chemic,unit] %D \stoptypen %D %D and in dutch: %D %D \starttypen %D \usemodules[pictex,chemie,eenheid] %D \stoptypen \def\definefilesynonym% {\dodoubleempty\dodefinefilesynonym} \def\dodefinefilesynonym[#1][#2]% {\doifdefined{\??fs#1} {\doifnotvalue{\??fs#1}{#2} {\showmessage{\m!files}{1}{#1 (#2),\getvalue{\??fs#1}}}}% \doifelse{#1}{#2} {\letbeundefined{\??fs#1}{#2}} {\setevalue{\??fs#1}{#2}}} %D \macros %D {truefilename} %D %D At the system level such a filename can be called upon by %D saying: %D %D \starttypen %D \truefilename{filename/filesynonym} %D \stoptypen %D %D The implementation shows that nesting is supported. \def\truefilename#1% {\ifundefined{\??fs#1}% #1% \else \truefilename{\getvalue{\??fs#1}}% \fi} %D \macros %D {makeshortfilename} %D %D To prevent cross platform problems with filenames, we %D lowercase them as well as only use the first 8~characters. \def\domakeshortfilename[#1#2#3#4#5#6#7#8#9]% {\lowercase{\edef\shortfilename{#1#2#3#4#5#6#7#8.}}% \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename} \def\makeshortfilename[#1]% {\edef\fullfilename{#1.........}% \expanded{\domakeshortfilename[\fullfilename]}} %D \macros %D {usemodule} %D %D Most of \CONTEXT is preloaded in the format file. Some very %D domain specific typesetting topics are however dealt with in %D separate modules, e.g. typesetting of chemical structure %D formulas. These modules are loaded by: %D %D \showsetup{\y!usemodule} %D %D More information on the specific modules can be found in %D their dedicated manuals. We use \type {\next} so that we %D can \type {\end} in modules. \newconditional\moduleisloaded \def\dododousemodules#1#2% no \unprotect/\protect when loading, {\relax % since we need to use ? ! unprotected \ifconditional\moduleisloaded % sometimes (see xtag-map) \let\next\relax \else \makeshortfilename[#1\truefilename{#2}]% \doifundefinedelse{\shortfilename\v!aan} {\setgvalue{\shortfilename\v!aan}{}% \def\next {\startreadingfile \readsysfile{\shortfilename}% {\showmessage{\m!systems}{5}{#2}% \settrue\moduleisloaded}% {}% \stopreadingfile}} {\showmessage{\m!systems}{7}{#2}% \settrue\moduleisloaded \let\next\relax}% \fi \next} \def\dodousemodules#1% {\setfalse\moduleisloaded \dododousemodules\f!moduleprefix {#1}% \dododousemodules\f!privateprefix{#1}% \dododousemodules\f!styleprefix {#1}% \dododousemodules\f!xstyleprefix {#1}% \dododousemodules\f!thirdprefix {#1}% \ifconditional\moduleisloaded\else \showmessage{\m!systems}{6}{#1}% \fi} \def\dousemodules[#1]% {\doifelsenothing{#1} {\let\next\relax} {\def\next{\processcommalist[#1]\dodousemodules}} \next} \def\usemodules% {\dosingleargument\dousemodules} %D We also support a singular call, which saves us for %D frustrations when we do a typo. \let\usemodule=\usemodules % %D The definition shows that the language specific settings % %D are activated after loading all the modules specified. %D \macros %D {ifprotectbuffers, bufferprefix, %D TEXbufferfile, MPgraphicfile} %D %D The next switch enables protection of temporary filenames, %D which is needed when we process more files on one path at %D the same time. \newif\ifprotectbuffers \def\bufferprefix% {\ifprotectbuffers\jobname-\fi} % also \def\TEXbufferfile#1% {\bufferprefix#1.\f!temporaryextension} %D We also redefine: \def\MPgraphicfile% {\bufferprefix mp\ifMPrun run\else graph\fi} \def\convertMPcolorfile% {\bufferprefix metacmyk.tmp} %D Temporarilly here: \def\definieerfilegroep% {\dodoubleargument\dodefinieerfilegroep} \def\dodefinieerfilegroep[#1][#2]% {\getparameters [\??fp#1] [\c!file=#1, \c!voor=, \c!na=, #2]% \setvalue{\e!start#1}{\dostartfilegroep[#1]}} \def\dostartfilegroep% {\dodoubleargument\dodostartfilegroep} \def\dodostartfilegroep[#1][#2]% {\getvalue{\??fp#1\c!voor}% \setvalue{\e!stop#1}{\dostopfilegroep[#1][#2]}% \edef\!!stringa{\getvalue{\??fp#1\c!file}-#2}% \@EA\dolaadfilegroep\@EA[\!!stringa]% \getvalue{\e!start#1#2}} \def\dolaadfilegroep[#1-#2#3#4#5]% {\readsysfile{#1-#2#3#4}{}{}} \def\dostopfilegroep[#1][#2]% {\getvalue{\e!stop#1#2}% \getvalue{\??fp#1\c!na}} % usage: % % \fetchruntimecommand\showaccents{\f!encodingprefix ...} \def\fetchruntimecommand#1#2% {\def#1{\dofetchruntimecommand#1{#2}}} \def\dofetchruntimecommand#1#2% {\doifundefined{@@@#2@@@}{\let#1\undefined\doinputonce{#2}}% \ifx#1\undefined \writestatus{\m!systems}{command \string#1 not found in file #2}% \def#1{{\infofont[unknown command \string#1]}}% \fi #1} %D This will be perfected / changed / weeded. \protect \endinput