From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/exptl/mem/mem.sty | 1439 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1439 insertions(+) create mode 100644 macros/latex/exptl/mem/mem.sty (limited to 'macros/latex/exptl/mem/mem.sty') diff --git a/macros/latex/exptl/mem/mem.sty b/macros/latex/exptl/mem/mem.sty new file mode 100644 index 0000000000..a541aeb20c --- /dev/null +++ b/macros/latex/exptl/mem/mem.sty @@ -0,0 +1,1439 @@ +% (c) 2001-2005 Javier Bezos + +\def\fileversion{0.0004 pre-alpha} + +\iffalse % ========================== +To do: + +- verbatim + - scripts + Some settings (eg. names) should be done in two steps: + \chaptername = \chaptername or maybe not? +- AtBeginLanguage +- AtEndLanguage +- Hacer que al cargar una escritura rm/sf/ttfamily se ajusten + para esa escritura? Así si se vuelve se conservan. +- Idea? platform + language => charset, eg, [unix, czech] + is the same as [charset=isolat2] +- Most of definitions in .sd files should be moved to + font encoding files. If a language requires another + definition (Greek \~) then set it with + \DeclareLanguageCommand. +- En lugar de mem.cfg, hacer eg spanish.mem which llama + a spa.ld, ajusta las codificaciones, los patrones, etc. + (?) + +\fi %======================== + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{mem} + [2004/08/22 Multilingual LaTeX support for Lamed/Lambda] + +\DeclareOption{loadonly}{\let\mem@sel@opt\relax} + +% Now, a buggy setup in TeXLive 2003 is fixed. The +% best solution is to remove the file: +% \texmf\omega\lambda\omegabook\ltpatch.ltx +% Only restored if uctt, perhaps a package has +% customized fonts + +\def\mem@a{uctt} +\ifx\ttdefault\mem@a + \def\ttdefault{cmtt} +\fi + +%\def\sfdefault{cmss} + +\newcount\mem@count + +\def\mem@@{mem-} +\def\mem@@trpr{mem-trpr-} +\def\mem@@prop{mem-prop-} +\def\mem@@flag{mem-flag-} +\def\mem@csflag#1{\csname mem-flag-#1\endcsname} + +\def\mem@last{{}{}} + +\input{mem-comm.sty} + +% \mem@cmd{prefix}{}{suffix} searchs the +% following definitions in an expandable way: +% +% \mem-prefix-suffix -> dialect +% \mem-prefix!-suffix -> language +% \mem-prefix?-suffix -> global +% +% and uses the first one found. Must be used +% inside \csname. +% +% Is it possible to extend it to script? +% 2005-12-08 Add \@empty after #3 in case it's {}. + +\long\def\mem@cmd#1#2#3{% + \mem@@#1% + \expandafter + \ifx\csname\mem@@#1#2-\string#3\@empty\endcsname\relax % if not language + \expandafter\ifx\csname\mem@@?#2\endcsname\relax % if not language + ?% + \else% + \expandafter % if not !language + \ifx\csname\mem@@#1\csname\mem@@?#2\endcsname-\string#3\@empty\endcsname\relax + ?% + \else % if !language + \csname\mem@@?#2\endcsname + \fi + \fi + \else % if language + #2% + \fi-\string#3\@empty} + +% \mem@use is a shorthand. If fact \mem@cmd is used directly +% only once + +\long\def\mem@use#1#2{\mem@cmd{#1}\languagename{#2}} + +\def\mem@ifno#1#2#3#4{% + \if#1n\if#2o#3\else\@firstoftwo\fi\else#4\fi} + +% \def\mem@ifup#1#2#3#4{% +% \if#1u\if#2p#3\else\@firstoftwo\fi\else#4\fi} + +\def\AtEndComponent#1{% + \@ifundefined{\mem@@flag#1}% + {\mem@error{Unknown component}} + {\@ifundefined{mem@no#1}% + {\@ifundefined{\mem@@\languagename-#1}% + {\expandafter\let\csname\mem@@\languagename-#1\endcsname\@empty}% + \@empty + \expandafter\mem@after + \csname\mem@@\languagename-#1\expandafter\endcsname}\@gobble}} + +\def\mem@eadd#1{% + \@ifundefined{\mem@@flag#1}% + {\mem@error{Unknown module}} + {\@ifundefined{mem@no#1}% + {\@ifundefined{\mem@@\languagename-#1}% + {\expandafter\let\csname\mem@@\languagename-#1\endcsname\@empty}% + \@empty + \expandafter\mem@eafter + \csname\mem@@\languagename-#1\expandafter\endcsname}\@gobble}} + +\def\DeclareLanguage#1{% + \def\languagename{!#1}% + \def\mem@main{!#1}% + \DeclareDialect{#1}} + +\def\DeclareDialect#1{% + \expandafter\let\csname\mem@@?#1\endcsname\mem@main + \expandafter + \@namedef{#1text}{\languagetext{#1}}% + \@ifundefined{#1}% + {\newenvironment{#1}{\languageset{#1}}{}}% + {\PackageWarning{mem}{Skipping declaration of #1 + environment.\MessageBreak This name already exists.}}} + +\@onlypreamble\DeclareLanguage +\@onlypreamble\DeclareDialect + +\def\SetLanguage#1{% + \@ifundefined{\mem@@?#1}% + {\mem@bug@err4}% + {\edef\languagename{!#1}}} + +\def\SetDialect#1{ + \@ifundefined{\mem@@?#1}% + {\mem@bug@err4}% + {\edef\languagename{#1}}} + +\@onlypreamble\SetLanguage +\@onlypreamble\SetDialect + +\def\mem@ifcomponent#1{\@ifundefined{\mem@@flag#1}% + {\mem@bug@err1\@gobble}} + +% Components +% ~~~~~~~~~~ + +\def\DeclareLanguageComponent{% + \@ifstar{\mem@newcomponent\mem@c}% + {\mem@newcomponent\mem@text@components}} + +\def\mem@newcomponent#1#2{% + \def\mem@a##1##2##3\mem@a{% + \mem@ifno##1##2}% + \mem@a#2\mem@a + {\mem@bug@err2}% + {\@ifundefined{\mem@@flag#2}% + {\mem@eafter\mem@components{% Note the flag expands to \relax + \noexpand\mem@elt\mem@csflag{#2}{#2}}% + \mem@eafter#1{% + \noexpand\mem@elt\mem@csflag{#2}{#2}}% + \expandafter\edef + \csname\mem@@prop?-#2\endcsname{% + \noexpand\mem@flagon{\mem@csflag{#2}}% + \noexpand\@tempswafalse}% + \expandafter\edef + \csname\mem@@prop?-no#2\endcsname{% + \noexpand\mem@flagoff{\mem@csflag{#2}}% + \noexpand\@tempswafalse}% + \expandafter\newcount\csname\mem@@flag#2\endcsname}% + {\PackageInfo{mem}% + {Ignoring component declaration: #2.^^J% + Already declared\@gobble}}}} + +\@onlypreamble\DeclareLanguageComponent +\@onlypreamble\mem@newcomponent + +\let\mem@components\@empty +\let\mem@text@components\@empty +\let\mem@c\@empty + +\DeclareLanguageComponent*{names} +\DeclareLanguageComponent*{layout} + +\DeclareLanguageComponent{date} +\DeclareLanguageComponent{processes} +\DeclareLanguageComponent{tools} + +\expandafter\let\csname\mem@@prop?-text\endcsname\relax +\expandafter\let\csname\mem@@prop?-notext\endcsname\relax + +\def\mem@enable{% Implicit #1 + \let\mem@ifenabling\@firstoftwo + \mem@switch} + +\def\mem@disable{% Implicit #1 + \let\mem@ifenabling\@secondoftwo + \mem@switch} + +\def\mem@switch#1{% !language + \@nameuse{\mem@@\@nameuse{\mem@@?\languagename}-#1}% -!language- + \@nameuse{\mem@@\languagename-#1}} % -dialect- + +\def\mem@switch@cmd#1#2{% + \let\mem@c=#1% + \let#1=#2% + \let#2=\mem@c} + +\def\mem@disablesub#1#2{% + \ifcase#1\or\or + \@gobble\or\mem@disable{#2}% + \else + \advance#1-\tw@ + \fi} + +\def\mem@enablesub#1#2{% + \ifcase#1\or\or + \@gobble\or\mem@enable{#2}% + \fi} + +\def\mem@submain#1#2{% + #1=\ifcase#1\z@\or + \@ne\or + \z@\or + \@ne\mem@enable{#2}\or + \tw@\or + \thr@@\mem@disable{#2}\or + \tw@\or + \thr@@\or + 4 \or + 5 \mem@disable{#2}\or + 4 \or + 5 \fi\relax} + +\def\mem@disablemain#1#2{% + \ifcase#1\or\mem@disable{#2}\fi} + +\def\mem@enablemain#1#2{% Considerar la marca -\@m + #1=\ifnum#1<\z@\z@\else\@ne\mem@enable{#2}\fi} + +\def\mem@step#1{\let\mem@elt#1\mem@components} + +%%% 2005-12-08 Added grouping for languageset + +\def\languageset{% + \@ifstar{\mem@sel@i\@ne}{\mem@sel@i\z@}} + +% Task: Replacing the text for empty +\def\mem@sel@i#1{% +% To be used later. If \...text, then \mem@pardir = \@empty + \def\mem@pardir{\pardir\csname\mem@@\mem@script-dir\endcsname}% + \@ifnextchar[{\mem@sel@ii#1}{\mem@sel@ii#1[]}} + +\def\mem@sel@ii#1[#2]#3{% + \edef\mem@b{\zap@space#2 \@empty}% + \ifcase#1% + \edef\mem@a{{\expandafter\@firstoftwo\mem@last}{[\mem@b]{#3}}}% + \else + \def\mem@a{{[#2]{#3}}{}}% + \fi + \ifx\mem@a\mem@last\else + \let\mem@last\mem@a + \aftergroup\mem@fileends + \mem@filesetup#1{#2}{#3}% + \expandafter\mem@sel@iii\expandafter[\mem@b]{#3}#1% + \fi} + +\def\mem@sel@iii[#1]#2#3{% + \@ifundefined{l@#2}% + {\@ifundefined{memh@#2}% + {\mem@error{Unknown language}\language\z@}% + {\language\csname memh@#2\endcsname}}% + {\language\csname l@#2\endcsname}% + \let\mem@b\mem@script + \mem@step\mem@disablesub + \edef\languagename{#2}% + \ifcase#3% if local + \def\mem@flagon##1{\advance##14\relax}% + \def\mem@flagoff##1{\advance##18\relax}% + \@tempswatrue + \ExecuteLanguageProperties{#1}% + \if@tempswa % if there was not or + \def\mem@elt##1##2{\mem@flagon{##1}}% + \mem@text@components + \fi + \mem@csflag{processes}=5 + \let\languagename\mem@main + \mem@step\mem@submain + \edef\languagename{#2}% + \mem@step\mem@enablesub + \else % if global + \mem@step\mem@disablemain + \def\mem@flagon##1{\Error}% + \def\mem@flagoff##1{##1-\@m}% Just a mark + \@tempswatrue + \ExecuteLanguageProperties{#1}% + %\if@tempswa + % % to be used if syntax changes + %\fi + %\mem@csflag{processes}=\@ne + \edef\mem@main{#2}% + \edef\languagename{#2}% + \mem@step\mem@enablemain + \fi + \ifx\mem@b\mem@script\else\mem@switchfont\fi % mem@b saved above + \edef\mem@charset{\csname\mem@use{}{cset}\endcsname}% + \textdir\csname\mem@@\mem@script-dir\endcsname + %\ifvmode + \mem@pardir + %\bodydir\csname\mem@@\mem@script-dir\endcsname + %\fi + \let\mem@pardir\@empty + \SetLanguageProcess{charenc}{\mem@charset}% + \SelectProcesses} + +\def\mem@switchfont{% + \mem@eforeach{\mem@fontfamilies}{% + \@ifundefined{\mem@@ font-\languagename-##1}% + {\@ifundefined{\mem@@ font-\mem@script-##1}{}% + {\edef\rmdefault{% + \csname\mem@@ font-\mem@script-##1\endcsname}}}% + {\edef\rmdefault{% + \csname\mem@@ font-\languagename-##1\endcsname}}}% + \mem@family} % To be expanded and fine-tuned + +\def\mem@fontfamilies{rmfamily}%,sffamily,ttfamily} + +\DeclareRobustCommand\languagetext{\@ifnextchar[{\mem@text}{\mem@text[]}} + +% The following contains a trick to avoid passing the text as +% argument. The text is actually inside a group. + +\def\mem@text[#1]#2{% + \bgroup + \mem@sel@ii\z@[#1]{#2}% + \@ifnextchar\bgroup + {\let\mem@a}% Gobbles the opening { + {\mem@text@x}}% No braces--only a token + +\def\mem@text@x#1{#1\egroup} + +\def\languageunset{% + \@ifstar + {\languageset[]{\mem@main}}% + {\mem@unsel@i\mem@unsel@ii}} + +\def\mem@unsel@i{% + \c@mem@depth\z@ + \mem@fileends + \def\mem@elt##1{% + \expandafter\let\csname\mem@@slot##1\endcsname\@empty}% + \mem@elt{}% or \@empty?? + \mem@streams} + +\def\mem@unsel@ii{% + \edef\languagereset{% + \let\noexpand\languagereset\relax + \noexpand\mem@ensure\mem@last}% + \language\z@ + \mem@step\mem@disablesub + \mem@step\mem@disablemain + \def\mem@elt##1##2{\mem@csflag{##2}\z@}% + \mem@components + \let\languagename\@empty + %\SelectProcesses + %\let\mem@main\@empty %% 2004/08/04 Commented out + %\let\mem@trprlist\nullocplist + \def\mem@last{{}{}}} + +% Automatic switching of languages + +\def\UpdateScript#1{} + +% Synchonization with auxiliary files +% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +\AtBeginDocument{% + \if@filesw\else + \def\mem@filesetup#1#2#3{}% + \let\mem@filewrite\@gobble + \let\mem@fileends\relax + \fi} + +\AtEndDocument{% + \let\mem@newpage\newpage + \def\newpage{% + \let\newpage\mem@newpage + \newpage + \let\mem@immediate\immediate + \languageunset}} + +\let\mem@immediate\relax + +\def\mem@@slot{mem@slot@} + +\def\mem@filesetup#1#2#3{% + \advance\c@mem@depth\@ne + \def\mem@elt##1{% + \expandafter\mem@after\csname\mem@@slot##1\endcsname + {\addtocounter{\mem@@slot\the\mem@count}\@ne + \mem@immediate\write\mem@count + {\mem@begin + \noexpand\languageset\ifcase#1\or*\fi[#2]{#3}}}}% + \mem@elt\@empty + \mem@streams} + +\def\mem@filewrite#1{% + \mem@count=#1\relax + \@ifundefined{c@\mem@@slot\the\mem@count}% + {\newcounter{\mem@@slot\the\mem@count}% + \mem@slot@ + \let\mem@elt\relax + \xdef\mem@streams{\mem@streams\mem@elt{\the\mem@count}}}{}% + {\@nameuse{\mem@@slot\the\mem@count}}% + \expandafter\gdef\csname\mem@@slot\the\mem@count\endcsname{}} + +\def\mem@fileends{% + \def\mem@elt##1% + {\ifnum\value{\mem@@slot##1}>\c@mem@depth + \mem@immediate\write##1{\mem@end}% + \addtocounter{\mem@@slot##1}\m@ne + \expandafter\mem@elt + \else + \expandafter\@gobble + \fi{##1}}% + \mem@streams + \let\mem@elt\relax}% + +\let\mem@streams\@empty +\let\mem@slot@\@empty % <{\expandafter\noexpand\csname\mem@@ DF-##1\endcsname}% + \def\mem@a{% + \edef\mem@b{\endgroup% + \noexpand\DeclareLanguageCommand*{\noexpand#1}{date}{\mem@c}} + \mem@b}% + \afterassignment\mem@a\def\mem@c} +\endgroup + +\@onlypreamble\DeclareDateCommand + +\newcount\weekday + +\let\c@day\day +\let\c@weekday\weekday +\let\c@month\month +\let\c@year\year + +\def\SetWeekDay{\mem@count=\year\divide\mem@count4 + \weekday=\mem@count + \multiply\mem@count4 + \advance\mem@count-\year + \ifnum\mem@count=\z@ + \ifnum\month<\thr@@\advance\weekday -1\fi\fi + \advance\weekday\year + \advance\weekday-1899 + \advance\weekday\ifcase\month\or0 \or31 \or59 \or90 \or120 + \or151 \or181 \or212 \or243 \or293 \or304 \or334 \fi + \advance\weekday\day + \mem@count=\weekday + \divide\mem@count7 + \multiply\mem@count7 + \advance\weekday-\mem@count + \advance\weekday\@ne} + +\SetWeekDay + +\DeclareDateFunctionDefault{d}{\the\day} +\DeclareDateFunctionDefault{dd}{\ifnum\day<10 0\fi\the\day} + +\DeclareDateFunctionDefault{m}{\the\month} +\DeclareDateFunctionDefault{mm}{\ifnum\month<10 0\fi\the\month} + +\DeclareDateFunctionDefault{yy}{\expandafter\@gobbletwo\the\year} +\DeclareDateFunctionDefault{yyyy}{\the\year} + +\def\UpdateSpecial#1{% + \expandafter\mem@updatespecial\csname\string#1\endcsname} + +\def\mem@updatespecial#1{% + \def\mem@b##1##2{% + \ifnum`#1=`##2 \else + \noexpand##1\noexpand##2% + \fi}% + \def\mem@c##1##2{% + \ifnum\catcode`##2<\active + \ifnum\catcode`##2>10 \else\@firstoftwo\fi + \else + \noexpand##1\noexpand##2% + \fi}% + \def\do{\mem@b\do}% + \def\@makeother{\mem@b\@makeother}% + \edef\dospecials{\dospecials\mem@c\do#1}% + \edef\@sanitize{\@sanitize\mem@c\@makeother#1}% + \let\do\relax + \def\@makeother##1{\catcode`##1=12\relax}} + +\def\languageensure{% + \ifx\glossary\relax + \protect\mem@ensure\mem@last + \fi} + +\def\mem@ensure#1#2{% + \def\mem@a{{#1}{#2}}% + \ifx\mem@a\mem@last\else + \def\mem@a{#1}% + \ifx\mem@a\@empty + \def\mem@c{\mem@unsel@ii}% + \else + \def\mem@c{\mem@sel@iii#1\@ne}% + \fi + \def\mem@a{#2}% + \ifx\mem@a\@empty\else + \def\mem@a{#1}\edef\mem@b{\expandafter\@firstoftwo\mem@last}% + \ifx\mem@b\mem@a + \expandafter\def\else\expandafter\mem@after + \fi + \mem@c{\mem@sel@iii#2\z@}% + \fi + \expandafter\mem@c + \fi} + +% A recent change in LaTeX: now marks *are not* expanded 2004/08/05 + +\def\markboth#1#2{% + \begingroup + \let\label\relax \let\index\relax \let\glossary\relax + \protected@edef\mem@a##1##2{% + \noexpand\unrestored@protected@xdef + \noexpand\@themark + {{\languageensure##1}{\languageensure##2}}}% + \mem@a{#1}{#2}% + \@temptokena \expandafter{\@themark}% + \mark{\the\@temptokena}% + \endgroup + \if@nobreak\ifvmode\nobreak\fi\fi} + +\def\@markright#1#2#3{% + \@temptokena{#1}% + \protected@edef\mem@a##1##2{% + \noexpand\unrestored@protected@xdef + \noexpand\@themark{{##1}{\languageensure##2}}}% + \mem@a{\the\@temptokena}{#3}} + +%====== + +%\DeclareProcess{T1}{t1-a, t2-a} + +%\DeclareLanguageProcessGroup +%\DeclareMemProcessGroup + +% Puesto quien decide si un grupo es language o mem es +% lo primero, se puede reducir a una forma: + +%\AddMemProcess{font}{fontenc} +%\AddLanguageProcess{text}{sigma,otro,otro} % Logical + +%\SetMemProcess{fontenc}{T1} +%\SetLanguageProcess{fontenc}{T1} + +%\SelectProcesses % Ambos + +\def\DeclareLanguageProcessGroup{\mem@declproc\languagename} +\def\DeclareMemProcessGroup{\mem@declproc?} + +\let\mem@procgroups\@empty + +% Añadir debug: Que muestre las definiciones, activaciones y +% estados actuales. + +% The first version sorted the groups by numerical order, but +% as the ocp mechanism already uses the number to sort them +% (this is one of its features), I don't think this is +% is necessary. The previous version is: +% +% \def\mem@declproc#1#2#3{% +% \let\mem@a\@empty +% \@tempswatrue +% \def\mem@pg##1##2##3{% +% \if@tempswa +% \ifnum##2=#2\relax +% \Error +% \else\ifnum##2>#2 +% \mem@after\mem@a{% +% \mem@pg{#1}{#2}{#3}\mem@pg{##1}{##2}{##3}}% +% \@tempswafalse +% \else +% \mem@after\mem@a{\mem@pg{##1}{##2}{##3}}% +% \fi\fi +% \else +% \mem@after\mem@a{\mem@pg{##1}{##2}{##3}}% +% \fi}% +% \mem@procgroups +% \if@tempswa +% \mem@after\mem@a{\mem@pg{#1}{#2}{#3}} +% \fi +% \let\mem@procgroups\mem@a} +% +% This version would have to be expanded in order to check +% multiple declarations. +% +% The new one is: + +\def\mem@declproc#1#2#3{% + % Multiple declarations are allowed provided they are + % consistent: + \@tempswatrue % true if to be added + \def\mem@pg##1##2##3{% + \ifnum#2=##2 + \def\mem@a{#1{}#3}\def\mem@b{##1{}##3}% + \ifx\mem@a\mem@b + \@tempswafalse + \else + \Error + \fi + \fi + \def\mem@a{#3}\def\mem@b{##3}% + \ifx\mem@a\mem@b + \def\mem@a{\number#2{}#1}\def\mem@b{\number##2{}##1}% + \ifx\mem@a\mem@b + \@tempswafalse + \else + \Error + \fi + \fi}% + \mem@procgroups + \if@tempswa + \mem@after\mem@procgroups{\mem@pg{#1}{#2}{#3}}% + \fi} + + +\DeclareLanguageProcessGroup{200}{charset} +\DeclareLanguageProcessGroup{400}{unicode} +\DeclareLanguageProcessGroup{600}{transcript} +\DeclareLanguageProcessGroup{800}{input} +% 1000: case +\DeclareLanguageProcessGroup{1200}{text} +\DeclareMemProcessGroup{1400}{font} + +\def\DeclareProcess#1#2{% + \mem@ecs\let{mem-tp-?-#1}\@empty + \mem@ecs\mem@lafter{mem-tp-?-#1}\mem@elt{#2}% + \global\mem@ecs\let{mem-tp-?-#1\expandafter}\csname mem-tp-?-#1\endcsname} + +% The following is variant to assign a different ocp for +% a certain language - for example, a different uppercase +% ocp for Turkish. To investigate if this is the right way, +% which explain why the syntax is different + +\def\DeclareLanguageProcess#1#2{% + \mem@ecs\let{mem-tp-\languagename-#1}\@empty + \mem@ecs\mem@lafter{mem-tp-\languagename-#1}\mem@elt{#2}% + \global\mem@ecs + \let{mem-tp-\languagename-#1\expandafter}% + \csname mem-tp-\languagename-#1\endcsname} + +\def\mem@setproc#1#2#3{% + \mem@ecs\let{mem-pp-#1-#2}\@empty + \mem@ecs\mem@lafter{mem-pp-#1-#2}\mem@elttp{#3}% + \def\mem@elttp##1{% + %\expandafter\show\csname mem-tp-##1\endcsname + \@ifundefined{mem-tp-?-##1}% +% Añadir aquí la posibilidad de un .mpd + {\DeclareProcess{##1}{##1}}% + {}}% + \@nameuse{mem-pp-#1-#2}} + +\def\SetMemProcess{\mem@setproc?} +\def\SetLanguageProcess{\mem@setproc\languagename} + +% We must avoid duplicated entries, so that we can +% add processes redundantly (for example, in 'case'): + +\def\mem@addproc#1#2#3{% + \mem@setcsvar{mem-lp-#1-#2}% + \def\mem@eltpp##1{,##1,}% + \mem@eforeach{#3}{% + \@expandtwoargs\in@{,##1,}{,\@nameuse{mem-lp-#1-#2},}% + \ifin@\else + \mem@ecs\mem@after{mem-lp-#1-#2}{\mem@eltpp{##1}}% + \@ifundefined{mem-pp-#1-##1}% + {\mem@setproc#1{##1}{##1}}% + {}% + \fi}} + +\def\AddMemProcess{\mem@addproc?} +\def\AddLanguageProcess{\mem@addproc\languagename} + +\def\mem@selectprocs#1#2#3{% + % Make sure mem-lp-?-#3 is not undefined/relax + \mem@setcsvar{mem-lp-?-#3}% + \def\mem@eltpp##1{% + \@ifundefined{\mem@use{pp-}{##1}}% + {}% + {\csname\mem@use{pp-}{##1}\endcsname}}% + \def\mem@elttp##1{\csname\mem@use{tp-}{##1}\endcsname}% + % Build the ocplist name + \edef\mem@elt##1{\string/##1}% + \edef\mem@c{\csname\mem@use{lp-}{#3}\endcsname}% + \ifx\mem@c\@empty\else + \edef\mem@a{cpl-\csname\mem@use{lp-}{#3}\endcsname}% + \mem@debug\@ne{Processing OCP list \mem@c\space for group #3 (#2)}% + \@ifundefined{\mem@a}% + {\mem@debug\@ne{- Defining OCP list \mem@c}% + % Define ocps, if necessary + \def\mem@elt##1{% + \@ifundefined{ocp-##1}% <- Seleccionar el ocp correcto + {\mem@debug\@ne{-- Loading OCP ##1}% + \global\mem@ecs\ocp{ocp-##1}=##1\relax}% + {}}% + \csname\mem@use{lp-}{#3}\endcsname + % Build the ocplist body and define ocplist + \def\mem@elt##1{% + \addbeforeocplist #2 % + \@nameuse{ocp-##1}}% + \edef\mem@c{% + \global\mem@ecs\ocplist{\mem@a}% + \csname\mem@use{lp-}{#3}\endcsname + \nullocplist}% + \mem@c}% + {}% + % Build \ShowProcesses data + \def\mem@eltpp##1{^^J(Mem) - ##1 = \csname\mem@use{pp-}{##1}\endcsname}% + \def\mem@elttp##1{##1 : \csname\mem@use{tp-}{##1}\endcsname}% + \def\mem@elt##1{##1 }% + \mem@eafter\mem@toshow{^^J(Mem) #2 (#3): \csname\mem@use{lp-}{#3}\endcsname}% + % Push the list + \mem@eafter\mem@topush{\mem@ecs\pushocplist{\mem@a}}% + \fi} + +\def\SelectProcesses{% + \mem@debug\@ne{====================}% +% \ifx\languagename\@empty +% \mem@debug\@ne{Rebuilding processes for (no language) +% on input line \the\inputlineno}% +% \else + \mem@debug\@ne{Rebuilding processes for \languagename\space + on input line \the\inputlineno}% +% \fi + \edef\mem@toshow{% + (Mem) ==========================================^^J% + (Mem) \string\ShowProcesses\space(logical = physical : ocps)}% + \let\mem@frompush\mem@topush + \let\mem@topush\@empty + \let\mem@pg\mem@selectprocs + \mem@procgroups + \ifx\mem@frompush\mem@topush + \mem@debug\@ne{Skipping - currently active}% + \else + \clearocplists + \mem@debug\@ne{Activating}% + \mem@topush + \fi} +%\ShowProcesses} + % Ambos +\def\ShowProcesses{\typeout{\mem@toshow}} + + + + +% Font processing +% ~~~~~~~~~~~~~~~ + +% Let's modify \selectfont. Essentialy it selects a language using +% the current font enconding and then redefines what an encoding means. +% +% Automatic selection of font encoding based on fd files--if there +% is an fd file for some combination then select it (with certain +% preferences). Hovever, it turns out that t1cmr exists but pointing to +% _another_ font, and that ot1omlgc points to an ut1 encoded font. + +\expandafter\let\expandafter + \mem@selectfont\csname selectfont \endcsname + +\DeclareRobustCommand\selectfont{% + \let\mem@fencoding\f@encoding + \@ifundefined{\mem@@\languagename-\f@family-enc}% + {\mem@eforeach{\csname\mem@@\languagename-encs\endcsname}{% + \lowercase{\edef\mem@a{##1}}% + \IfFileExists{\mem@a\f@family.fd}% + {\@namedef{\mem@@\languagename-\f@family-enc}{##1}% + \@ifundefined{\mem@@ T@##1}% + {\global\@namedef{\mem@@ T@##1}{}% + \@ifundefined{T@##1}{\global\@namedef{T@##1}{}}{}% + \def\f@encoding{##1}% + \setbox\z@\vbox\bgroup % dummy box + \catcode`\\=0 + \catcode`\{=1 + \catcode`\}=2 + \catcode`\^^M=5 + \catcode`\ =10 + \catcode`\^^I=10 + \catcode`\%=14 + \input{\mem@a.ed}% + \egroup}% + {}% + \fontencoding{##1}% + \SetMemProcess{fontenc}{\csname\mem@@##1-process\endcsname}% + \mem@lastfor}% + {}}% + \ifx\mem@forcmd\@gobble\else +% \PackageError{mem}% +% {Unable to find a proper encoding for a font +% family \f@family}% +% {The list of encodings for that language [...]}% + \fi}% + {\fontencoding{\csname\mem@@\languagename-\f@family-enc\endcsname}% + \edef\f@encoding{\csname\mem@@\languagename-\f@family-enc\endcsname}% + \SetMemProcess{fontenc}{\csname\mem@@\f@encoding-process\endcsname}}% + % Select new process only if the encoding has changed + \ifx\mem@fencoding\f@encoding\else + \SelectProcesses + \fi + \mem@selectfont + \begingroup % ***** An input in an ocp is ignored? <<<<< + % Sadly, there is a bug and it is. + \nfss@catcodes + \let\nfss@catcodes\relax + \@ifundefined{TS1/\f@family/m/n}% + {\InputIfFileExists{ts1\f@family.fd}{}{}}% + {}% + \endgroup} + +% \..family are modified too keep track of the +% current family, so that if the script changes +% the family is still the same. To be fine tuned. + +\DeclareRobustCommand\rmfamily + {\not@math@alphabet\rmfamily\mathrm + \let\mem@family\rmfamily + \fontfamily\rmdefault\selectfont} +\DeclareRobustCommand\sffamily + {\not@math@alphabet\sffamily\mathsf + \let\mem@family\sffamily + \fontfamily\sfdefault\selectfont} +\DeclareRobustCommand\ttfamily + {\not@math@alphabet\ttfamily\mathtt + \let\mem@family\ttfamily + \fontfamily\ttdefault\selectfont} + +\let\mem@family\rmfamily + + +% Properties +% ~~~~~~~~~~ + +\def\DeclareLanguageProperty{% + \@ifstar{\mem@prop@s}{\mem@prop@x}} + +\def\mem@prop@s#1{% Implicit #2 + \edef\mem@b{\zap@space#1 \@empty}% + \expandafter\def\csname\mem@@prop\languagename-\mem@b\endcsname##1} + +\def\mem@prop@x#1#2{% + \edef\mem@b{\zap@space#1 \@empty}% + \expandafter\def\csname\mem@@prop\languagename-\mem@b\endcsname{#2}} + +% There are parameters depending on both the language and the font +% encoding. However, they may not be known when the package is +% loaded. They are set with \languageproperties, but I think that's +% not very rubust. +% +% Currently works as if it was in fact named \dialectproperties + +\def\languageproperties#1#2{% + \let\mem@savelang\languagename + \def\languagename{#1}% + \expandafter\edef\csname\mem@@#1-prlt\endcsname{\zap@space#2 \@empty}% + \mem@eforeach{\zap@space#2 \@empty}{% + \csname\mem@cmd{prop-}{#1}{##1}\endcsname}% %<<---remove??? + \edef\mem@b{#1}% + \ifx\mem@savelang\languagename + \ExecuteLanguageProperties{\zap@space#2 \@empty}% + \mem@switchfont + \fi + \let\languagename\mem@savelang} + +\def\ExecuteLanguageProperties#1{% + \@ifundefined{\mem@@\languagename-prlt}% + {\let\mem@a\@empty}% + {\edef\mem@a{\csname\mem@@\languagename-prlt\endcsname,}}% + \mem@eforeach{\mem@a#1}{% + \def\mem@b{##1}% + \ifx\mem@b\@empty\else + \@ifundefined{\mem@use{prop-}{##1}}% + {% Raise error if there is no = + \expandafter\mem@executegen##1\\}% ??Lo siguiente con \edef? + {\csname\mem@use{prop-}{##1}\endcsname}% + \fi}} + +\def\mem@executegen#1=#2\\{% + \csname\mem@use{prop-}{#1}\endcsname{#2}} + +% Properties shared by all languages as generic tools. +% They are assigned to the ? language in the top of the +% tree. When executed, \languagename contains the actual +% name of the active language. + +\def\languagename{?} + +\DeclareLanguageProperty*{charset}{% + \@namedef{\mem@@\languagename-cset}{#1}% + \SetLanguageProcess{charenc}{#1}} + +\DeclareLanguageProperty*{hyphenation}{% + \def\mem@hyphenation{#1}} + +\DeclareLanguageProperty*{fontencs}{% + \mem@setencs\languagename{#1}} + +\DeclareLanguageProperty*{rmfamily}{% + \@namedef{\mem@@ font-\languagename-rmfamily}{#1}} + +\DeclareLanguageProperty*{sffamily}{% + \@namedef{\mem@@ font-\languagename-sffamily}{#1}} + +\DeclareLanguageProperty*{ttfamily}{% + \@namedef{\mem@@ font-\languagename-ttfamily}{#1}} + +\AddMemProcess{font}{fontenc} + +\AddLanguageProcess{charset}{charenc} +%\SetLanguageProcess{charenc}{\expandafter\noexpand\@nameuse{\mem@use{}{cset}}} +%\SetLanguageProcess{charenc}{isolat1} + +% Scripts +% ~~~~~~~ + +\def\SetLanguageScript#1{% + \mem@foreach{#1}{% + \lowercase{\edef\mem@b{##1}}% + \@ifundefined{\mem@@ script-##1}{\input{\mem@b.sd}}{}% + \def\mem@a{##1}}% script description + \edef\mem@b{% + \noexpand\DeclareLanguageCommand{\noexpand\mem@script}{processes}{\mem@a}}% + \mem@b} + +\def\DeclareScript#1{% + \@namedef{\mem@@ script-#1}{}% + \def\mem@script{#1}% + \lowercase{\def\mem@b{#1}}% + \expandafter\let\csname\mem@@ lang-#1\endcsname\mem@b} + +\def\SetScriptDirection#1{% + \expandafter\def\csname\mem@@\mem@script-dir\endcsname{#1}} + +\def\mem@setencs#1#2{\@namedef{\mem@@#1-encs}{#2}} + +\def\DeclareScriptSymbol#1#2{% + \let#1\relax + \newcommand{#1}{\unichar{#2}}} + +\def\DeclareScriptCommand#1{% + \let#1\relax % Implicit #1#2 etc + \newcommand{#1}} + + +\def\scriptproperties#1#2{% + \mem@eforeach{\zap@space#2 \@empty}{% + \mem@setfamily#1\\##1\\}% + \long\def\mem@b{#1}% \long because \mem@script is \long!! + \ifx\mem@b\mem@script\mem@switchfont\fi} + +\def\mem@setfamily#1\\#2=#3\\{% + \@namedef{\mem@@ font-#1-#2}{#3}} + + +% ========================== + +\def\SetEncodingScript#1{}% + +% \def\SetEncodingDirection#1{% +% \global\@namedef{\mem@@\f@encoding-dir}{#1}} + +\newcommand\SetEncodingProcess[2]{% + \DeclareProcess{#1}{#2}% + \SetMemProcess{fontenc}{#1}% + \global\@namedef{\mem@@\f@encoding-process}{#1}} + +\SetEncodingProcess{t1}{t1-dec,t1-rec,t1-com} +%\SelectProcesses + +% Note the following does not switch the encoding name. +% In other words, symbols are incorporated as part of +% the main encoding and not as a separate encoding. +% The final decision about what font to use is left +% to the font encoding OCP. +% To be fixed. + +\def\SetSymbolEncodings#1{% + \@ifundefined{\mem@@ T@##1}% + {\global\@namedef{\mem@@ T@##1}{}% + \@ifundefined{T@##1}{\global\@namedef{T@##1}{}}{}} + {}} + +% \let\mem@textcmd\DeclareTextCommand +% +% \def\DeclareEncodingSymbol#1#2{% +% \mem@textcmd{#1}{\f@encoding}{\unichar{#2}}} +% +% \def\DeclareEncodingCommand#1{% Implicit #1#2 etc +% \mem@textcmd{#1}{\f@encoding}} + +% ============================= + +% Charsets +% ~~~~~~~~ +% +% The escape char in the ASCII/Unicode charsets is used as +% a escape with several meanings (given by the second char). +% It is used by charset to unicode ocp's to enter a Unicode +% value directly without conversion. + +{\catcode`\^^1b=11 +\catcode`\^^00=11 +\catcode`\^^01=11 +\catcode`\^^02=11 +\gdef\unichar#1{\mem@protected{^^1b^^00#1^^1b}\unichar{#1}} +\gdef\unitext#1{\mem@protected{^^1b^^01#1^^1b}\unitext{#1}} +\gdef\utftext#1{\mem@protected{^^1b^^02#1^^1b}\utftext{#1}} +\gdef\utfstring#1{\mem@protected{^^1b^^02#1^^1b}\utfstring{#1}} +} + +\DeclareRobustCommand\utftext[1]{{% + \ExecuteLanguageProperties{charset=utf8}% + \SelectProcesses + #1}} + +% ==================== + +% onfss + +\def\onfss@symenc{TS1} +\DeclareFontEncoding{\onfss@symenc}{}{} + +\DeclareRobustCommand\UseMemTextSymbol[1]{% + {[[#1]]\fontencoding{\onfss@symenc}\mem@selectfont\char#1 }} + +\DeclareRobustCommand\UseMemTextSymbol[2]{% + {\fontencoding{#1}\mem@selectfont\char#2 }} + +% \setbox\z@\hbox{\rmfamily\UseMemTextSymbol{TS1}{167}% +% \sffamily\UseMemTextSymbol{TS1}{167}% +% \ttfamily\UseMemTextSymbol{TS1}{167}} + +%================ + +% Package options + +\let\PreLoadPatterns\@gobbletwo + +\def\SetPatterns#1#2{% + \expandafter\chardef + \csname memh@#1\endcsname=#2\relax} + +\def\LoadLanguage#1#2#3#4{% + \DeclareOption{#1}{\mem@input{#1}{#2}{#3}{#4}}} + +\def\mem@input#1#2#3#4{% + \@ifundefined{languagelist}% + {\edef\languagelist{#1}}% + {\edef\languagelist{\languagelist,#1}}% + \@ifundefined{memh@#1}% + {\expandafter\let\csname memh@#1\expandafter\endcsname + \csname memh@#3\endcsname% + \PackageInfo{mem}% + {#1 with #3 patterns\@gobble}}\@empty + \@ifundefined{\mem@@?#1}% + {\lowercase{\edef\mem@b{#2}}% + \InputIfFileExists{#2.ld}% + {}% + {\mem@error{Missing language file}}} + {}% And make sure the right dialect is selected: + \mem@setencs{#1}{#4}% + \edef\languagename{#1}% + \mem@ecs\def{\mem@@\languagename-isocode}{#2}} + +\everyjob\expandafter{\the\everyjob\SetWeekDay} + +\def\mem@process#1=#2\mem@process{% + \@ifundefined{\mem@@ gopt-#1}% + {\mem@error{Error}} + {\@nameuse{\mem@@ gopt-#1}{#2}}} + +\@namedef{\mem@@ gopt-charset}#1{% + \SetMemProcess{charenc}{#1}% + \@namedef{\mem@@?-cset}{#1}} + +\SetMemProcess{charenc}{utf8} +\@namedef{\mem@@?-cset}{utf8} + +\DeclareOption*{% + \@expandtwoargs\in@{=}{\CurrentOption}% + \ifin@ + \expandafter\mem@process\CurrentOption\mem@process + \else + \mem@error{Error}%\expandafter\mem@input\CurrentOption\mem@input% + \fi} + +\input{mem.cfg} + +\def\mem@sel@opt{% + \PackageInfo{mem}% + {Selecting document language:\MessageBreak + \languagename\@gobble}% + \expandafter\languageset\expandafter*\expandafter + {\languagename}% + \bodydir\csname\mem@@\mem@script-dir\endcsname} + +\ProcessOptions* + +\mem@sel@opt + +% Select the interface + +\InputIfFileExists{\csname\mem@@\languagename-isocode\endcsname + \csname\mem@@?-cset\endcsname.id}{}{} + + % Implicit #2#3 +\def\UseMemAccent#1{\csname mem@accent@#1\endcsname} + +% There are four kind of accents. +% +% t: Top accent is the usual accent, which +% can be combined with the well known diatop macro +% #2 is either c or l, if continues or it's the +% last accent; used only in t- + +\def\mem@accent@t#1#2#3{% This is the well known diatop macro. + \if#2c% + \leavevmode + \begingroup + \setbox1=\hbox{{\accent#1{}}}% + \setbox2=\hbox{{#3{}}}% + \dimen0=\ifdim\wd1>\wd2\wd1\else\wd2\fi + \dimen1=\ht2\advance\dimen1by-1ex + \setbox1=\hbox to1\dimen0{\hss\accent#1\hss}% + \rlap{\raise1\dimen1\box1}% + \hbox to1\dimen0{\hss#3\hss}% + \endgroup + \else + \accent#1 #3% + \fi} + +% u: bot accent based on an accent, like \b + +\def\mem@accent@u#1#2#3{% 9 + \hmode@bgroup + \o@lign{\relax#3\crcr\hidewidth\sh@ft{29}% + \vbox to.2ex{\hbox{\char#1}\vss}\hidewidth}% + \egroup} + +\let\mem@accent@a\mem@accent@u % to remove + +% b: bot accent with an "underaccent" like \c + +\def\mem@accent@b#1#2#3{% 11 + \leavevmode + \setbox\z@\hbox{#3}% + \ifdim\ht\z@=1ex + \accent#1 #3% + \else + {\ooalign{\hidewidth\char#1\hidewidth + \crcr\unhbox\z@}}% + \fi} + +% c: bot accent with an "underaccent" like \c + +\let\mem@accent@c\mem@accent@b + +% p: bot accent with a puntuaction point, like \d + +\def\mem@accent@p#1#2#3{% + \hmode@bgroup + \o@lign{\relax#3\crcr\hidewidth\sh@ft{10}#1\hidewidth}% + \egroup} + +% k: an special case (task: to investigate) for \k + +\def\mem@accent@k#1#2#3{% + \oalign{\null#3\crcr\hidewidth\char#1}} + +\def\UseMemUnichar#1{\char#1 } + +% ====== Verbatim +% The following characters are used in ocp files to ensure their +% catcode is always the same even if in verbatim mode. See mtp2ocp +% for further details (it replaces \, {, }, etc. by the chars below). + +\catcode"E000=0 % \ +\catcode"E001=1 % { +\catcode"E002=2 % } +\catcode"E003=3 % $ +\catcode"E004=4 % & +\catcode"E005=5 % +\catcode"E006=6 % # +\catcode"E007=7 % ^ +\catcode"E008=8 % _ + +% Special chars to the PUA. This is necessary because ocp's +% recatcode the chars. + +\def\#{\unichar{"E123}} +\def\${\unichar{"E124}} +\def\%{\unichar{"E125}} +\def\&{\unichar{"E126}} +\def\_{\unichar{"E15F}} + +% =============== Math + +\def\DeclareMathSymbol#1#2#3#4{% + \expandafter\in@\csname sym#3\expandafter\endcsname + \expandafter{\group@list}% + \ifin@ + \begingroup + \if\relax\noexpand#1% is command? + \edef\reserved@a{\noexpand\in@{\string\mathchar}{\meaning#1}}% + \reserved@a + \ifin@ + \expandafter\set@mathsymbol\csname sym#3\endcsname#1#2{#4}% + \@font@info{Redeclaring math symbol \string#1}% + \else + \expandafter\ifx + \csname\expandafter\@gobble\string#1\endcsname + \relax + \expandafter\set@mathsymbol\csname sym#3\endcsname#1#2{#4}% + \else + \@latex@error{Command `\string#1' already defined}\@eha + \fi + \fi + \else + \expandafter\set@mathchar\csname sym#3\endcsname#1#2{#4}% + \fi + \endgroup + \else + \@latex@error{Symbol font `#3' is not defined}\@eha + \fi +} + +\def\mem@setmath#1#2#3#4{% + \count@\mathchar@type#3 + \multiply\count@256 + \advance\count@#1 + \multiply\count@65536 + \advance\count@#4 + \global#2\count@} + +\def\set@mathchar#1#2{\mem@setmath{#1}{\omathcode`#2=}} +\def\set@mathsymbol#1#2{\mem@setmath{#1}{\omathchardef#2}} + +\def\MemUnknownCharacter#1{% + \vrule width .6em + \PackageWarning{Mem}{Unknown character \number`#1\space}} + +% The original definition of \do@noligs includes a \char and +% \char's has been always problematic in omega. Here is a +% redefinition which uses the actual char. 2005-12-08 + +\def\do@noligs#1{% + \catcode`#1\active + \begingroup + \lccode`\~`#1\relax + \lowercase{\endgroup + \def~{\leavevmode\kern\z@\expandafter\@gobble\string#1}}} + +\def\MemMoveOtherChar#1{\relax\expandafter\@gobble\string#1} + +\endinput +%% +%% End of file `mem.sty'. -- cgit v1.2.3