summaryrefslogtreecommitdiff
path: root/tex/context/base/catc-act.mkiv
blob: 2cde28e44f1d133eb3299ae5aad40874603f96c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
%D \module
%D   [       file=catc-act,
%D        version=2006.09.18,
%D          title=\CONTEXT\ Catcode Macros,
%D       subtitle=Default Catcode Tables,
%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.

%D This module deals with some active character handling. Use
%D with care.

%D \macros
%D   {installactivecharacter}

\def\installactivecharacter#1 %
  {\edef\temp{\detokenize{#1}}%
   \cctcounterc\expandafter`\temp\relax % relax needed
   \expandafter\startextendcatcodetable
      \expandafter\ctxcatcodes\expandafter\catcode\the\cctcounterc\activecatcode
   \stopextendcatcodetable
   \letcatcodecommand \ctxcatcodes \cctcounterc \temp \relax
   \ifnum\currentcatcodetable=\ctxcatcodes \setcatcodetable\ctxcatcodes \fi}

%D \macros
%D   {defineactivecharacter}
%D
%D Use this one with care, esp in combination with catcode
%D vectors. There are better ways now.

\chardef\activehackcode=`~

\def\defineactivecharacter #1#2 #3%
  {\cctcounterc\uccode\activehackcode
   \if#1"\uccode\activehackcode\expandafter\doifnumberelse\expandafter{\string#1#2}\empty #1#2\else
         \uccode\activehackcode\expandafter\doifnumberelse\expandafter{\string#1#2}\empty`#1#2\fi
   \catcode\uccode\activehackcode\activecatcode
   \uppercase{\def\next{~}}%
   \uccode\activehackcode\cctcounterc
   \expandafter\expandafter\expandafter\def\expandafter\next\expandafter
     {\expandafter\dohandleactivecharacter\next{#3}}}

\chardef\activecharactermode\plusone % overloading still backward compatible

\def\dodohandleactivecharacter#1#2{#2}
\def\donthandleactivecharacter#1#2{\noexpand#1}

\def\dohandleactivecharacter
  {\ifcase\activecharactermode
     \expandafter\donthandleactivecharacter
   \else
     \expandafter\dodohandleactivecharacter
   \fi}

\def\makecharacteractive #1 {\catcode`#1\active}

\def\installanddefineactivecharacter #1 % #2%
  {\normalexpanded{\noexpand\installactivecharacter \utfchar{#1} }%
   \defineactivecharacter #1 }% {#2}}

\endinput