mult-ini.mkiv /size: 28 Kb    last modification: 2021-10-28 13:50
1
%D \module
2
%D [ file=mult-ini,
3
%D version=2008.10.22, % 1996.06.01,
4
%D title=\CONTEXT\ Multilingual Macros,
5
%D subtitle=Initialization,
6
%D author=Hans Hagen,
7
%D date=\currentdate,
8
%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9
%C
10
%C This module is part of the \CONTEXT\ macro||package and is
11
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12
%C details.
13 14
%D This module is a stripped down version of \type {mult-ini.tex}, which we keep
15
%D around as \type {mult-kep.tex} for sentimental reasons. There you will find some
16
%D more historic information.
17 18
\writestatus
{
loading
}
{
ConTeXt
Multilingual
Macros
/
Initialization
}
19 20
\unprotect
21 22
\registerctxluafile
{
mult
-
ini
}
{
}
23
\registerctxluafile
{
mult
-
fmt
}
{
initexonly
}
24 25
%D \macros
26
%D [constanten,variabelen,commands]
27
%D {v!,c!,k!,s!,e!,m!,l!,r!,f!,p!,x!,y!}
28
%D
29
%D In the system modules we introduced some prefixed constants, variables (both
30
%D macros) and registers. Apart from a tremendous saving in terms of memory and a
31
%D gain in speed we use from now on prefixes when possible for just another reason:
32
%D consistency and multi||linguality. Systematically using prefixed macros enables
33
%D us to implement a multi||lingual user interface. Redefining these next set of
34
%D prefixes therefore can have desastrous results.
35
%D
36
%D \startlinecorrection
37
%D \starttable[|c|c|c|]
38
%D \HL
39
%D \NC \bf prefix \NC \bf meaning \NC \bf application \NC\SR
40
%D \HL
41
%D \NC \type{\c!prefix!} \NC c! \NC constant (direct) \NC\FR
42
%D \NC \type{\k!prefix!} \NC k! \NC constant (indirect) \NC\FR
43
%D \NC \type{\e!prefix!} \NC e! \NC element \NC\MR
44
%D \NC \type{\f!prefix!} \NC f! \NC file \NC\MR
45
%D \NC \type{\m!prefix!} \NC m! \NC age \NC\MR
46
%D \NC \type{\s!prefix!} \NC s! \NC system \NC\MR
47
%D \NC \type{\v!prefix!} \NC v! \NC variable \NC\MR
48
%D \HL
49
%D \stoptable
50
%D \stoplinecorrection
51
%D
52
%D In the single||lingual version we used \type {!}, \type {!!}, \type {!!!} and
53
%D \type {!!!!}. In the meantime some of these are obsolete (we had some 12
54
%D originally).
55 56
\def
\c!prefix!
{
c
!
}
57
\def
\k!prefix!
{
k
!
}
58
\def
\e!prefix!
{
e
!
}
59
\def
\f!prefix!
{
f
!
}
% for the moment we keep this one
60
\def
\m!prefix!
{
m
!
}
61
\def
\s!prefix!
{
s
!
}
62
\def
\v!prefix!
{
v
!
}
63
\def
\t!prefix!
{
t
!
}
64 65
%D \macros
66
%D [constants,variables,commands]
67
%D {@@,??}
68
%D
69
%D Variables generated by the system can be recognized on their prefix \type {@@}.
70
%D They are composed of a command (class) specific tag, which can be recognized on
71
%D \type {??}, and a system constant, which has the prefix \type {c!}. We'll se some
72
%D more of this.
73 74
\def
\??prefix
{
?
?
}
75
\def
\@@prefix
{
@
@
}
76 77
%D Just to be complete we repeat some of the already defined system constants here.
78
%D Maybe their prefix \type {\s!} now falls into place.
79 80
\def
\s!next
{
next
}
\def
\s!default
{
default
}
81
\def
\s!dummy
{
dummy
}
\def
\s!unknown
{
unknown
}
82 83
\def
\s!do
{
do
}
\def
\s!dodo
{
dodo
}
84 85
\def
\s!complex
{
complex
}
\def
\s!start
{
start
}
86
\def
\s!simple
{
simple
}
\def
\s!stop
{
stop
}
87 88
\def
\s!true
{
true
}
89
\def
\s!false
{
false
}
90 91
%D The word \type {height} takes 6~token memory cells. The control sequence \type
92
%D {\height} on the other hand uses only one. Knowing this, we can improve the
93
%D performance of \TEX, both is terms of speed and memory usage, by using control
94
%D sequences instead of the words written in full.
95
%D
96
%D Where in the \ASCII\ file the second lines takes nine extra characters, \TEX\
97
%D saves us 13~tokens.
98
%D
99
%D \starttyping
100
%D \hrule width 10pt height 2pt depth 1pt
101
%D \hrule \s!width 10pt \s!height 2pt \s!depth 1pt
102
%D \stoptyping
103
%D
104
%D One condition is that we have defined \type {\s!height}, \type {\s!width} and
105
%D \type {\s!depth} as respectively \type {height}, \type {width} and \type {depth}.
106
%D Using this scheme therefore only makes sense when a token sequence is used more
107
%D than once. Savings like this should of course be implemented in english, just
108
%D because \TEX\ is english.
109 110
\def
\s!width
{
width
}
111
\def
\s!height
{
height
}
112
\def
\s!depth
{
depth
}
113
\def
\s!spread
{
spread
}
114
\def
\s!plus
{
plus
}
115
\def
\s!minus
{
minus
}
116
\def
\s!to
{
to
}
117 118
\def
\s!fil
{
fil
}
119
\def
\s!fill
{
fill
}
120
\def
\s!filll
{
filll
}
121 122
\def
\s!attr
{
attr
}
123
\def
\s!axis
{
axis
}
124
\def
\s!both
{
both
}
125
\def
\s!bottom
{
bottom
}
126
\def
\s!left
{
left
}
127
\def
\s!options
{
options
}
128
\def
\s!orientation
{
orientation
}
129
\def
\s!reverse
{
reverse
}
130
\def
\s!right
{
right
}
131
\def
\s!top
{
top
}
132
\def
\s!xmove
{
xmove
}
133
\def
\s!xoffset
{
xoffset
}
134
\def
\s!ymove
{
ymove
}
135
\def
\s!yoffset
{
yoffset
}
136 137
%D \macros
138 139
%D {defineinterfaceconstant,
140
%D defineinterfacevariable,
141
%D defineinterfaceelement,
142
%D definesystemvariable,
143
%D definesystemconstant,
144
%D definemessageconstant,
145
%D definefileconstant}
146
%D
147
%D The first part of this module is dedicated to dealing with multi||lingual
148
%D constants and variables. When \CONTEXT\ grew bigger and bigger in terms of bytes
149
%D and used string space, we switched to predefined constants. At the cost of more
150
%D hash table entries, the macros not only becase more compact, they became much
151
%D faster too. Maybe an even bigger advantage was that mispelling could no longer
152
%D lead to problems. Even a multi||lingual interface became possible.
153
%D
154
%D Constants |<|we'll introduce the concept of variables later on|>| are preceded by
155
%D a type specific prefix, followed by a \type {!}. To force consistency, we provide
156
%D a few commands for defining such constants.
157
%D
158
%D \starttyping
159
%D \defineinterfaceconstant {name} {meaning}
160
%D \defineinterfacevariable {name} {meaning}
161
%D \defineinterfaceelement {name} {meaning}
162
%D \stoptyping
163
%D
164
%D Which is the same as:
165
%D
166
%D \starttyping
167
%D \def\c!name{meaning}
168
%D \def\v!name{meaning}
169
%D \def\e!name{meaning}
170
%D \stoptyping
171 172
\protected
\def
\defineinterfaceconstant
#
1
#
2
{
\expandafter
\def
\csname
\c!prefix!
#
1
\endcsname
{
#
2
}
}
173
\protected
\def
\defineinterfacevariable
#
1
#
2
{
\expandafter
\def
\csname
\v!prefix!
#
1
\endcsname
{
#
2
}
}
174
\protected
\def
\defineinterfaceelement
#
1
#
2
{
\expandafter
\def
\csname
\e!prefix!
#
1
\endcsname
{
#
2
}
}
175 176
%D Next come some interface independant constants:
177
%D
178
%D \starttyping
179
%D \definefileconstant {name} {meaning}
180
%D \stoptyping
181 182
\protected
\def
\definefileconstant
#
1
#
2
{
\expandafter
\def
\csname
\f!prefix!
#
1
\endcsname
{
#
2
}
}
183 184
%D And finaly we have the one argument, space saving constants
185
%D
186
%D \starttyping
187
%D \definesystemconstant {name}
188
%D \definemessageconstant {name}
189
%D \stoptyping
190 191
\protected
\def
\definesystemconstant
#
1
{
\expandafter
\def
\csname
\s!prefix!
#
1
\endcsname
{
#
1
}
}
192
\protected
\def
\definemessageconstant
#
1
{
\expandafter
\def
\csname
\m!prefix!
#
1
\endcsname
{
#
1
}
}
193 194
%D For now here:
195 196
\protected
\def
\definetagconstant
#
1
{
\expandafter
\def
\csname
\t!prefix!
#
1
\endcsname
{
#
1
}
}
197
\protected
\def
\aliastagconstant
#
1
#
2
{
\expandafter
\let
\csname
\t!prefix!
#
1
\expandafter
\endcsname
\csname
\t!prefix!
#
2
\endcsname
}
198 199
%D In a parameter driven system, some parameters are shared by more system
200
%D components. In \CONTEXT\ we can distinguish parameters by a unique prefix. Such a
201
%D prefix is defined with:
202
%D
203
%D \starttyping
204
%D \definesystemvariable {name}
205
%D \stoptyping
206 207
\protected
\def
\definesystemvariable
#
1
{
\expandafter
\edef
\csname
\??prefix
#
1
\endcsname
{
\@@prefix
#
1
}
}
208 209
\definesystemvariable
{
ms
}
210 211
%D \macros
212
%D {selectinterface,
213
%D defaultinterface, currentinterface, currentresponses}
214
%D
215
%D With \type {\selectinterface} we specify the language we are going to use. The
216
%D system asks for the language wanted, and defaults to \type {\currentinterface}
217
%D when we just give \type {enter}. By default the message system uses the current
218
%D interface language, but \type {\currentresponses} can specify another language
219
%D too.
220
%D
221
%D Because we want to generate formats directly too, we do not ask for interface
222
%D specifications when these are already defined (like in cont-nl.tex and alike).
223 224
\ifdefined
\defaultinterface
225 226
\def
\selectinterface
227
{
\writestatus
{
interface
}
{
defining
\currentinterface
\space
interface
}
%
228
%writeline
229
\writestatus
{
interface
}
{
using
\currentresponses
\space
messages
}
%
230
%\writeline
231
\let
\selectinterface
\relax
}
232 233
\else
234 235
\def
\defaultinterface
{
english
}
236 237
\def
\selectinterface
238
{
\def
\selectinterface
#
#
1
#
#
2
%
239
{
\bgroup
240
\endlinechar
\minusone
241
\global
\read
1
6
to
#
#
1
242
\egroup
243
\doifnothing
\currentinterface
{
\let
#
#
1
=
#
#
2
}
%
244
\doifundefined
{
\s!prefix!
#
#
1
}
{
\let
#
#
1
=
#
#
2
}
}
%
245
\selectinterface
\currentinterface
\defaultinterface
246
\writestatus
{
interface
}
{
defining
\currentinterface
\space
interface
}
%
247
%\writeline
248
\selectinterface
\currentresponses
\currentinterface
249
\writestatus
{
interface
}
{
using
\currentresponses
\space
messages
}
%
250
%\writeline
251
\let
\selectinterface
\relax
}
252 253
\fi
254 255
\ifdefined
\currentinterface
\else
\let
\currentinterface
\defaultinterface
\fi
256
\ifdefined
\currentresponses
\else
\let
\currentresponses
\defaultinterface
\fi
257 258
%D \macros
259
%D {startinterface}
260
%D
261
%D Sometimes we want to define things only for specific interface languages. This
262
%D can be done by means of the selector:
263
%D
264
%D \starttyping
265
%D \startinterface language
266
%D
267
%D language specific definitions & commands
268
%D
269
%D \stopinterface
270
%D \stoptyping
271 272
\protected
\def
\startinterface
#
1
273
{
\doifnot
{
#
1
}
{
all
}
{
\doifnotinset
\currentinterface
{
#
1
}
{
\gobbleuntil
\stopinterface
}
}
}
274 275
\let
\stopinterface
\relax
276 277
%D \macros
278
%D {startmessages,
279
%D getmessage,
280
%D showmessage,
281
%D makemessage}
282
%D
283
%D A package as large as \CONTEXT\ can hardly function without a decent message
284
%D mechanism. Due to its multi||lingual interface, the message subsystem has to be
285
%D multi||lingual too. A major drawback of this feature is that we have to code
286
%D messages. As a result, the source becomes less self documented. On the other
287
%D hand, consistency will improve.
288
%D
289
%D Because the overhead in terms of entries in the (already exhausted) hash table
290
%D has to be minimal, messages are packed in libraries. We can extract a message
291
%D from such a library in three ways:
292
%D
293
%D \starttyping
294
%D \getmessage {library} {tag}
295
%D \showmessage {library} {tag} {data}
296
%D \makemessage {library} {tag} {data}
297
%D \stoptyping
298
%D
299
%D The first command gets the message \type {tag} from the \type {library}
300
%D specified. The other commands take an extra argument: a list of items to be
301
%D inserted in the message text. While \type {\showmessage} shows the message at the
302
%D terminal, the other commands generate the message as text. Before we explain the
303
%D \type {data} argument, we give an example of a library.
304
%D
305
%D \starttyping
306
%D \startmessages english library: alfa
307
%D title: something
308
%D 1: first message
309
%D 2: second (--) message --
310
%D \stopmessages
311
%D \stoptyping
312
%D
313
%D The first message is a simple one and can be shown with:
314
%D
315
%D \starttyping
316
%D \showmessage {alfa} {1} {}
317
%D \stoptyping
318
%D
319
%D The second message on the other hand needs some extra data:
320
%D
321
%D \starttyping
322
%D \showmessage {alfa} {2} {and last,to you}
323
%D \stoptyping
324
%D
325
%D This message is shown as:
326
%D
327
%D \starttyping
328
%D something : second (and last) message to you
329
%D \stoptyping
330
%D
331
%D As we can see, the title entry is shown with the message. The data fields are
332
%D comma separated and are specified in the message text by \type {--}.
333
%D
334
%D It is not required to define all messages in a library at once. We can add
335
%D messages to a library in the following way:
336
%D
337
%D \starttyping
338
%D \startmessages english library: alfa
339
%D 10: tenth message
340
%D \stopmessages
341
%D \stoptyping
342
%D
343
%D Because such definitions can take place in different modules, the system gives a
344
%D warning when a tag occurs more than once. The first occurrence takes preference
345
%D over later ones, so we had better use a save offset, as shown in the example. As
346
%D we can see, the title field is specified only the first time!
347
%D
348
%D Because we want to check for duplicate tags, the macros are a bit more
349
%D complicated than neccessary. The \NEWLINE\ token is used as message separator.
350
%D
351
%D For internal purposes one can use \type {\setmessagetext}, which puts the message
352
%D text asked for in \type {\currentmessagetext}.
353
%D
354
%D These will become obsolete:
355 356
\protected
\def
\startmessages
#
1
library
:
#
2
%
357
{
\begingroup
358
\ifcsname
\m!prefix!
#
2
\endcsname
\else
\setgvalue
{
\m!prefix!
#
2
}
{
#
2
}
\fi
359
\catcode
\endoflineasciicode
\othercatcode
360
\doifelseinset
{
#
1
}
{
\currentresponses
,
all
}
\mult_messages_start_yes
\mult_messages_start_nop
{
#
2
}
}
361 362
\def
\mult_messages_start_yes
#
1
#
2
\stopmessages
363
{
\clf_setinterfacemessages
{
#
1
}
{
#
2
}
%
364
\endgroup
}
365 366
\def
\mult_messages_start_nop
#
1
#
2
\stopmessages
367
{
\endgroup
}
368 369
\let
\stopmessages
\relax
370 371
\protected
\def
\setinterfacemessage
#
1
#
2
#
3
%
372
{
\ifcsname
\m!prefix!
#
1
\endcsname
\else
\setgvalue
{
\m!prefix!
#
1
}
{
#
1
}
\fi
373
\clf_setinterfacemessage
{
#
1
}
{
#
2
}
{
#
3
}
}
374 375
\protected
\def
\setmessagetext
#
1
#
2
{
\relax
\edef
\currentmessagetext
{
\clf_getmessage
{
#
1
}
{
#
2
}
}
}
376
\protected
\def
\getmessage
#
1
#
2
{
\relax
\clf_getmessage
{
#
1
}
{
#
2
}
}
377
\protected
\def
\doifelsemessage
#
1
#
2
{
\relax
\clf_doifelsemessage
{
#
1
}
{
#
2
}
}
378
\protected
\def
\showmessage
#
1
#
2
#
3
{
\relax
\clf_showmessage
{
#
1
}
{
#
2
}
{
#
3
}
}
379
\protected
\def
\writestatus
#
1
#
2
{
\relax
\clf_writestatus
{
#
1
}
{
#
2
}
}
380
\protected
\def
\message
{
\relax
\clf_message
}
381 382
\let
\doifmessageelse
\doifelsemessage
383 384
\protected
\def
\inlinemessage
#
1
{
\dontleavehmode
{
\tttf
#
1
}
}
385
\protected
\def
\displaymessage
#
1
{
\blank
\inlinemessage
{
#
1
}
\blank
}
386 387
\let
\getsetupstring
\clf_getsetupstring
388
\let
\rawsetupstring
\clf_rawsetupstring
389 390
%D For old times sake:
391 392
\let
\showwarning
\showmessage
393 394
%D \macros
395
%D {dosetvalue,dosetevalue,dosetgvalue,dosetxvalue,docopyvalue,doresetvalue} % dogetvalue
396
%D
397
%D We already defined these auxiliary macros in the system modules. Starting with
398
%D this module however, we have to take multi||linguality a bit more serious.
399
%D
400
%D In due time, when we exclusively use the parameter handler code, we can drop the
401
%D backmapping (\type{\c!k...}) and make \type {\c!c...} similar to \type {\v!...}.
402
%D In that case we can simply the following setters.
403 404
\protected
\def
\doletvalue
#
1
#
2
{
\expandafter
\let
\csname
#
1
\ifcsname
\k!prefix!
#
2
\endcsname
\csname
\k!prefix!
#
2
\endcsname
\else
#
2
\fi
\endcsname
}
405
\protected
\def
\dosetvalue
#
1
#
2
{
\expandafter
\def
\csname
#
1
\ifcsname
\k!prefix!
#
2
\endcsname
\csname
\k!prefix!
#
2
\endcsname
\else
#
2
\fi
\endcsname
}
406
\protected
\def
\dosetevalue
#
1
#
2
{
\expandafter
\edef
\csname
#
1
\ifcsname
\k!prefix!
#
2
\endcsname
\csname
\k!prefix!
#
2
\endcsname
\else
#
2
\fi
\endcsname
}
407
\protected
\def
\dosetgvalue
#
1
#
2
{
\expandafter
\gdef
\csname
#
1
\ifcsname
\k!prefix!
#
2
\endcsname
\csname
\k!prefix!
#
2
\endcsname
\else
#
2
\fi
\endcsname
}
408
\protected
\def
\dosetxvalue
#
1
#
2
{
\expandafter
\xdef
\csname
#
1
\ifcsname
\k!prefix!
#
2
\endcsname
\csname
\k!prefix!
#
2
\endcsname
\else
#
2
\fi
\endcsname
}
409
\protected
\def
\doresetvalue
#
1
#
2
{
\expandafter
\let
\csname
#
1
\ifcsname
\k!prefix!
#
2
\endcsname
\csname
\k!prefix!
#
2
\endcsname
\else
#
2
\fi
\endcsname
\empty
}
410
\protected
\def
\doignorevalue
#
1
#
2
#
3
{
\expandafter
\let
\csname
#
1
\ifcsname
\k!prefix!
#
2
\endcsname
\csname
\k!prefix!
#
2
\endcsname
\else
#
2
\fi
\endcsname
\empty
}
411 412
\protected
\def
\docopyvalue
#
1
#
2
#
3
%
413
{
\ifcsname
\k!prefix!
#
3
\endcsname
414
\expandafter
\def
\csname
#
1
\csname
\k!prefix!
#
3
\endcsname
\expandafter
\endcsname
\expandafter
415
{
\csname
#
2
\csname
\k!prefix!
#
3
\endcsname
\endcsname
}
%
416
\else
417
\expandafter
\def
\csname
#
1
#
3
\expandafter
\endcsname
\expandafter
418
{
\csname
#
2
#
3
\endcsname
}
%
419
\fi
}
420 421
\startinterface
english
422 423
\protected
\def
\doletvalue
#
1
#
2
{
\expandafter
\let
\csname
#
1
#
2
\endcsname
}
424
\protected
\def
\dosetvalue
#
1
#
2
{
\expandafter
\def
\csname
#
1
#
2
\endcsname
}
425
\protected
\def
\dosetevalue
#
1
#
2
{
\expandafter
\edef
\csname
#
1
#
2
\endcsname
}
426
\protected
\def
\dosetgvalue
#
1
#
2
{
\expandafter
\gdef
\csname
#
1
#
2
\endcsname
}
427
\protected
\def
\dosetxvalue
#
1
#
2
{
\expandafter
\xdef
\csname
#
1
#
2
\endcsname
}
428
\protected
\def
\doresetvalue
#
1
#
2
{
\expandafter
\let
\csname
#
1
#
2
\endcsname
\empty
}
429
\protected
\def
\doignorevalue
#
1
#
2
#
3
{
\expandafter
\let
\csname
#
1
#
2
\endcsname
\empty
}
430 431
\protected
\def
\docopyvalue
#
1
#
2
#
3
%
432
{
\expandafter
\def
\csname
#
1
#
3
\expandafter
\endcsname
\expandafter
433
{
\csname
#
2
#
3
\endcsname
}
}
434 435
\stopinterface
436 437
%D We can now redefine some messages that will be introduced in the multi||lingual
438
%D system module.
439 440
\protected
\def
\showassignerror
#
1
#
2
{
\showmessage
\m!check
1
{
#
1
,
#
2
}
}
441
\protected
\def
\showargumenterror
#
1
#
2
{
\showmessage
\m!check
2
{
#
1
,
#
2
}
}
442
\protected
\def
\showdefinederror
#
1
#
2
{
\showmessage
\m!check
3
{
#
1
,
#
2
}
}
443 444
%D \CONTEXT\ is a parameter driven package. This means that users instruct the
445
%D system by means of variables, values and keywords. These instructions take the
446
%D form:
447
%D
448
%D \starttyping
449
%D \setupsomething[some variable=some value, another one=a keyword]
450
%D \stoptyping
451
%D
452
%D or by keyword only:
453
%D
454
%D \starttyping
455
%D \dosomething[this way,that way,no way]
456
%D \stoptyping
457
%D
458
%D Because the same variables can occur in more than one setup command, we have to
459
%D be able to distinguish them. This is achieved by assigning them a unique prefix.
460
%D
461
%D Imagine a setup command for boxed text, that enables us to specify the height and
462
%D width of the box. Behide the scenes the command
463
%D
464
%D \starttyping
465
%D \setupbox [width=12cm, height=3cm]
466
%D \stoptyping
467
%D
468
%D results in something like
469
%D
470
%D \starttyping
471
%D \<box><width> {12cm}
472
%D \<box><height> {3cm}
473
%D \stoptyping
474
%D
475
%D while a similar command for specifying the page dimensions
476
%D of an \cap {A4} page results in:
477
%D
478
%D \starttyping
479
%D \<page><width> {21.0cm}
480
%D \<page><height> {27.9cm}
481
%D \stoptyping
482
%D
483
%D The prefixes \type {<box>} and \type {<page>} are hidden from users and can
484
%D therefore be language independant. Variables on the other hand, differ for each
485
%D language:
486
%D
487
%D \starttyping
488
%D \<box><color> {<blue>}
489
%D \<box><kleur> {<blauw>}
490
%D \<box><couleur> {<blue>}
491
%D \stoptyping
492
%D
493
%D In this example we can see that the assigned values or keywords are language
494
%D dependant too. This will be a complication when defining multi||lingual setup
495
%D files.
496
%D
497
%D A third phenomena is that variables and values can have a similar meaning.
498
%D
499
%D \starttyping
500
%D \<pagenumber><location> {<left>}
501
%D \<skip><left> {12cm}
502
%D \stoptyping
503
%D
504
%D A (minor) complication is that where in english we use \type {<left>}, in dutch
505
%D we find both \type {<links>} and \type {<linker>}. This means that when we use
506
%D some sort of translation table, we have to distinguish between the variables at
507
%D the left side and the fixed values at the right.
508
%D
509
%D The same goes for commands that are composed of different user supplied and/or
510
%D language specific elements. In english we can use:
511
%D
512
%D \starttyping
513
%D \<empty><figure>
514
%D \<empty><intermezzo>
515
%D \stoptyping
516
%D
517
%D But in dutch we have the following:
518
%D
519
%D \starttyping
520
%D \<lege><figuur>
521
%D \<leeg><intermezzo>
522
%D \stoptyping
523
%D
524
%D These subtle differences automatically lead to a solution where variables,
525
%D values, elements and other components have a similar logical name (used in
526
%D macro's) but a different meaning (supplied by the user).
527
%D
528
%D Our solution is one in which the whole system is programmed in terms of
529
%D identifiers with language specific meanings. In such an implementation, each
530
%D fixed variable is available as:
531
%D
532
%D \starttyping
533
%D \<prefix><variable>
534
%D \stoptyping
535
%D
536
%D This means that for instance:
537
%D
538
%D \starttyping
539
%D \setupbox[width=12cm]
540
%D \stoptyping
541
%D
542
%D expands to something like:
543
%D
544
%D \starttyping
545
%D \def\boxwidth{12cm}
546
%D \stoptyping
547
%D
548
%D because we don't want to recode the source, a setup command in another language
549
%D has to expand to this variable, so:
550
%D
551
%D \starttyping
552
%D \setupblock[width=12cm]
553
%D \stoptyping
554
%D
555
%D has to result in the definition of \type {\boxwidth} too. This method enables us
556
%D to build compact, fast and readable code.
557
%D
558
%D An alternative method, which we considered using, uses a more indirect way. In
559
%D this case, both calls generate a different variable:
560
%D
561
%D \starttyping
562
%D \def\boxwidth {12cm}
563
%D \def\boxbreedte {12cm}
564
%D \stoptyping
565
%D
566
%D And because we don't want to recode those megabytes of already developed code,
567
%D this variable has to be called with something like:
568
%D
569
%D \starttyping
570
%D \valueof\box\width
571
%D \stoptyping
572
%D
573
%D where \type {\valueof} takes care of the translation of \type {width} or \type
574
%D {breedte} to \type {width} and combining this with \type {box} to \type
575
%D {\boxwidth}.
576
%D
577
%D One advantage of this other scheme is that, within certain limits, we can
578
%D implement an interface that can be switched to another language at will, while
579
%D the current approach fixes the interface at startup. There are, by the way, other
580
%D reasons too for not choosing this scheme. Switching user generated commands is
581
%D for instance impossible and a dual interface would therefore give a strange mix
582
%D of languages.
583
%D
584
%D Now let's work out the first scheme. Although the left hand of the assignment is
585
%D a variable from the users point of view, it is a constant in terms of the system.
586
%D Both \type {width} and \type {breedte} expand to \type {width} because in the
587
%D source we only encounter \type {width}. Such system constants are presented as
588
%D
589
%D \starttyping
590
%D \c!width
591
%D \stoptyping
592
%D
593
%D This constant is always equivalent to \type {width}. As we can see, we use \type
594
%D {c!} to mark this one as constant. Its dutch counterpart is:
595
%D
596
%D \starttyping
597
%D breedte
598
%D \stoptyping
599
%D
600
%D When we interpret a setup command each variable is translated to it's \type{c!}
601
%D counterpart. This means that \type {breedte} and \type{width} expand to \type
602
%D {breedte} and \type {\c!width} which both expand to \type {width}. That way user
603
%D variables become system constants.
604
%D
605
%D The interpretation is done by means of a general setup command \type
606
%D {\getparameters} that we introduced in the system module. Let us define some
607
%D simple setup command:
608
%D
609
%D \starttyping
610
%D \protected\def\setupbox[#1]%
611
%D {\getparameters[\??bx][#1]}
612
%D \stoptyping
613
%D
614
%D This command can be used as:
615
%D
616
%D \starttyping
617
%D \setupbox [width=3cm, height=1cm]
618
%D \stoptyping
619
%D
620
%D Afterwards we have two variables \type {\@@bxwidth} and \type {\@@bxheight} which
621
%D have the values \type {3cm} and \type {1cm} assigned. These variables are a
622
%D combinatiom of the setup prefix \type {\??bx}, which expands to \type {@@bx} and
623
%D the translated user supplied variables \type {width} and \type {height} or \type
624
%D {breedte} and \type {hoogte}, depending on the actual language. In dutch we just
625
%D say:
626
%D
627
%D \starttyping
628
%D \stelblokin [breedte=3cm,hoogte=1cm]
629
%D \stoptyping
630
%D
631
%D and get ourselves \type {\@@bxwidth} and \type {\@@bxheight} too. In the source
632
%D of \CONTEXT, we can recognize constants and variables on their leading \type
633
%D {c!}, \type {v!} etc., prefixes on \type {??} and composed variables on \type
634
%D {@@}.
635
%D
636
%D We already saw that user supplied keywords need some special treatment too. This
637
%D time we don't translate the keyword, but instead use in the source a variable
638
%D which meaning depends on the interface language.
639
%D
640
%D \starttyping
641
%D \v!left
642
%D \stoptyping
643
%D
644
%D Which can be used in macro's like:
645
%D
646
%D \starttyping
647
%D \processaction
648
%D [\@@bxlocation]
649
%D [ \v!left=>\dosomethingontheleft,
650
%D \v!middle=>\dosomthinginthemiddle,
651
%D \v!right=>\dosomethingontheright]
652
%D \stoptyping
653
%D
654
%D Because variables like \type {\@@bxlocation} can have a lot of meanings,
655
%D including tricky expandable tokens, we cannot translate this meaning when we
656
%D compare. This means that \type {\@@bxlocation} can be \type {left} of \type
657
%D {links} of whatever meaning suits the language. But because \type {\v!left} also
658
%D has a meaning that suits the language, we are able to compare.
659
%D
660
%D Although we know it sounds confusing we want to state two important
661
%D characteristics of the interface as described:
662
%D
663
%D \startnarrower \em
664
%D user variables become system constants
665
%D \stopnarrower
666
%D
667
%D and
668
%D
669
%D \startnarrower \em
670
%D user constants (keywords) become system variables
671
%D \stopnarrower
672
%D
673
%D The \type {\c!internal} is a left over from the time that the user interface
674
%D documents were not using a specification alongside a keyword specification but
675
%D used a shared file in which case we need to go in both directions.
676 677
% temporary mkiv hack (we can best just store the whole table in memory)
678 679
\protected
\def
\setinterfaceconstant
#
1
#
2
%
680
{
\clf_setinterfaceconstant
{
#
1
}
{
#
2
}
%
681
\expandafter
\def
\csname
\c!prefix!
#
1
\endcsname
{
#
1
}
}
682 683
\protected
\def
\setinterfacevariable
#
1
#
2
%
684
{
\clf_setinterfacevariable
{
#
1
}
{
#
2
}
%
685
\expandafter
\def
\csname
\v!prefix!
#
1
\endcsname
{
#
2
}
}
686 687
%D \macros
688
%D {defineinterfaceconstant}
689
%D
690
%D Next we redefine a previously defined macro to take care of interface translation
691
%D too. It's a bit redundant, because in these situations we could use the
692
%D c||version, but for documentation purposes the x||alternative comes in handy.
693 694
\protected
\def
\defineinterfaceconstant
#
1
#
2
%
695
{
\expandafter
\def
\csname
\c!prefix!
#
1
\endcsname
{
#
2
}
}
696 697
%D \macros
698
%D {startelements}
699
%D
700
%D Due to the object oriented nature of \CONTEXT, we also need to define the
701
%D elements that are used to build commands.
702
%D
703
%D Such elements sometimes are the same in different languages, but mostly they
704
%D differ. Things can get even confusing when we look at for instance the setup
705
%D commands. In english we say \type{\setup<something>}, but in dutch we have: \type
706
%D {\stel<iets>in}. Such split elements are no problem, because we just define two
707
%D elements. When no second part is needed, we use a \type {-}:
708 709
\protected
\def
\setinterfaceelement
#
1
#
2
%
710
{
\clf_setinterfaceelement
{
#
1
}
{
#
2
}
%
711
\ifcsname
\e!prefix!
#
1
\endcsname
712
\doifnotvalue
{
\e!prefix!
#
1
}
{
#
2
}
{
\setvalue
{
\e!prefix!
#
1
}
{
#
2
}
}
%
713
\else
714
\setvalue
{
\e!prefix!
#
1
}
{
#
2
}
%
715
\fi
}
716 717
\protected
\def
\setinterfacecommand
#
1
#
2
%
718
{
\doifnot
{
#
1
}
{
#
2
}
% todo: let when already defined
719
{
\expandafter
\def
\csname
#
2
\expandafter
\endcsname
\expandafter
{
\csname
#
1
\endcsname
}
}
}
720 721
%D We just ignore these:
722 723
\protected
\def
\startvariables
{
\gobbleuntil
\stopvariables
}
\let
\stopvariables
\relax
724
\protected
\def
\startconstants
{
\gobbleuntil
\stopconstants
}
\let
\stopconstants
\relax
725
\protected
\def
\startelements
{
\gobbleuntil
\stopelements
}
\let
\stopelements
\relax
726
\protected
\def
\startcommands
{
\gobbleuntil
\stopcommands
}
\let
\stopcommands
\relax
727 728
%D For at the \LUA\ end (experiment):
729 730
\def
\ui_c
#
1
#
2
{
\expandafter
\gdef
\csname
\c!prefix!
#
1
\endcsname
{
#
1
}
%
731
\expandafter
\gdef
\csname
\k!prefix!
#
2
\endcsname
{
#
1
}
}
% backmapping from non english
732
\def
\ui_s
#
1
{
\expandafter
\gdef
\csname
\c!prefix!
#
1
\endcsname
{
#
1
}
%
733
\expandafter
\gdef
\csname
\k!prefix!
#
1
\endcsname
{
#
1
}
}
% backmapping from non english
734
\def
\ui_v
#
1
#
2
{
\expandafter
\gdef
\csname
\v!prefix!
#
1
\endcsname
{
#
2
}
}
735
\def
\ui_e
#
1
#
2
{
\expandafter
\gdef
\csname
\e!prefix!
#
1
\endcsname
{
#
2
}
}
736
%def\ui_m#1#2{\expandafter\gdef\csname#2\expandafter\endcsname\expandafter{\csname#1\endcsname}}
737
\def
\ui_a
#
1
#
2
{
\aliasmacro
#
2
#
1
}
738 739
\startinterface
english
740 741
\def
\ui_c
#
1
#
2
{
\expandafter
\gdef
\csname
\c!prefix!
#
1
\endcsname
{
#
1
}
}
742
\def
\ui_s
#
1
{
\expandafter
\gdef
\csname
\c!prefix!
#
1
\endcsname
{
#
1
}
}
743 744
\stopinterface
745 746
%D So much for the basic multi||lingual interface commands. The macro's can be
747
%D enhanced with more testing facilities, but for the moment they suffice.
748 749
\ifdefined
\zwnj
\else
\edef
\zwnj
{
\directlua{
utf
.
char
(
\number
"
200C)}} \fi % needed for cont-pe % maybe to char-utf.mkiv 750\ifdefined\zwj \else \edef\zwj {\directlua{utf.char(\number
"
200
D
)
}
}
\fi
% needed for cont-pe % maybe to char-utf.mkiv
751 752 753
%D \macros
754
%D {contextversion, contextversionnumber, contextversionno,
755
%D contextbanner, showcontextbanner, formatversion}
756
%D
757
%D Out of convenience we define the banners here. This might move to the \LUA\ end.
758 759
\def
\contextbanner
760
{
ConTeXt
\space
761
ver
:
\contextversion
\space
\contextmark
\space
\space
762
fmt
:
\formatversion
\space
\space
763
int
:
\currentinterface
/
\currentresponses
}
764 765
\protected
\def
\showcontextbanner
766
{
\writestatus
\m!system
\empty
767
\writestatus
\m!system
\contextbanner
768
\writestatus
\m!system
\empty
}
769 770
\edef
\formatversion
771
{
\the
\normalyear
.
\the
\normalmonth
.
\the
\normalday
}
772 773
\newcount
\contextversionno
774 775
\ifx
\contextversion
\undefined
776
\edef
\contextversion
{
\the
\normalyear
.
\the
\normalmonth
.
\the
\normalday
\space
0
0
:
0
0
}
777
\fi
778 779
% \def\contextversionnumber#1.#2.#3 #4:#5\relax{#1\ifnum#2<10 0\fi\purenumber{#2}\ifnum#3<10 0\fi\purenumber{#3} #4:#5}
780
% \edef\contextversionnumber{\expandafter\contextversionnumber\contextversion\relax\space\contextmark}
781 782
\protected
\def
\contextversionnumber
#
1
.
#
2
.
#
3
#
4
:
#
5
\relax
{
#
1
#
2
#
3
}
783
\contextversionno
\expandafter
\contextversionnumber
\contextversion
\relax
784
\edef
\contextversionnumber
{
\the
\contextversionno
\space
\contextmark
}
785 786
%D \macros
787
%D {everydump}
788
%D
789
%D This one is only used when we generate the format.
790 791
\ifx
\undefined
\everydump
792
\newtoks
\everydump
793
\def
\dump
{
\the
\everydump
\global
\everydump
\emptytoks
\glet
\dump
\relax
\normaldump
}
794
\fi
795 796
% \appendtoks \showcontextbanner \to \everydump
797 798
\protect
\endinput
799