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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
|
%% This is part of OpTeX project, see http://petr.olsak.net/optex
% Run optex optex-math (two times) to generate this document
% or look at PDF here: http://petr.olsak.net/ftp/olsak/optex/optex-math.pdf
\fontfam[lmfonts]
\font\ttlib=[LiberationMono-Regular]
\def\ttspec{\let\_ttfont=\ttlib}
\report
\def\new #1 {\mnote{\Red$\blacktriangleleft$\,\sans\setfontsize{at9pt}\rm#1}}
\fixmnotes\right
\enquotes
\activettchar`
\catcode`\<=13
\def<#1>{$\langle\hbox{\it#1\/}\rangle$}
\everyintt={\catcode`\<=13 }
\def\ss#1{$\vrule height3pt#1\vrule height3pt$}
\addto\_secfont\Blue \addto\_seccfont\Blue
\_def\_printsec#1{\_par
\_abovetitle{\_penalty-400}\_bigskip
{\_secfont \_noindent \_raggedright \llap{\_printrefnum[@\_quad]}#1\_nbpar}\_insertmark{#1}%
\_nobreak \_belowtitle{\_medskip}%
\_firstnoindent
}
\_def\_printsecc#1{\_par
\_abovetitle{\_penalty-200}\_medskip
{\_seccfont \_noindent \_raggedright \llap{\_printrefnum[@\_quad]}#1\_nbpar}%
\_nobreak \_belowtitle{\_medskip}%
\_firstnoindent
}
\hyperlinks\Green\Green
\insertoutline{MATH}
\outlines{0}
\tit Typesetting Math with \OpTeX/
\vskip-\baselineskip \hfill Version 01+
\author Petr Olšák
This document is a brief summary about typesetting math. It describes \TeX/,
Plain \TeX/ and \OpTeX/ features concerned to math. The first two types of
features are documented in \TeX/book in chapters 16, 17 and 18, but it is
summarized here in short again in order to give a complete guide about math
typesetting for \OpTeX/ users.
\new {}
The \OpTeX/ features which differs from standard \TeX/ or Plain \TeX/ are
documented with the red triangle at the margin (like in this paragraph).
Reader can simply distinguish between \"standard" features (given by
\TeX/ or Plain \TeX/) and new \OpTeX/ features.
There are more types of extensions: e\TeX, lua\TeX/, Unicode math and
\OpTeX/ macros. The appropriate label (e\TeX, Lua\TeX/, Unicode, \OpTeX/)
is appended to the red triangle to inform you about the extension type.
Nevertheless, \OpTeX/ user doesn't have to worry about it, all extensions
are available if Unicode Math font is loaded (e.g., by the command
`\fonfam[lmfonts]`). See section 1.3.3 in \OpTeX/ documentation about
loading Unicode math fonts.
{\iindent=2em
\bigskip
\maketoc }
\vfil\break
\sec Basics structure of math formulas
\secc General rules and terminology
The in-line math (in the paragraph) is created by `$<math list>$`. The
display math (standalone line between paragraphs) is created by `$$<math list>$$`.
More than one line can be here if appropriate macro is used. In-line math is
processed in a \TeX/ group in {\em in-line math mode}. The display math is
processed in a \TeX/ group in {\em display math mode}. Spaces are
ignored in math modes.
The <math list> is a sequence of {\em math atoms} and {\em other materials}.
The math atoms are {\em single math objects} or composed math atoms.
\begitems
* The single math object is a single character to be printed in math mode
like `x`, `+`, `\int`.
* The math atom is constructed in genereal by `{<mat list 1>}^{<math list 2>}_{<math list 3>}`.
It consists from {\em nucleus} <math list 1>, exponent <math list 2> and subscript
<math list 3>. Each part of the atom should be empty. If the mentioned <math list>
consist only from a single math object then we need not to use brackets, for example
`x^2` is a math atom with `x` in nucleus, `2` in exponent and with empty subscript.
Or `a_{i,j}` is a math atom with `a` in nucleus, empty exponent and `i,j` in subscript.
The constructors for exponent `^` and for subscript `_` can be used in arbitrary order
followed by the nucleus, for example `z_1^{x+y}` it the same math atom as
`z^{x+y}_1`. The single math objects not followed by `^` nor `_` are
considered as math atoms with this object in nucleus and with empty
exponent and subscript (this is very common case).
\TeX/ assigns the {\em class} for each math atom, see section~\ref[class].
* Other material can be \TeX/ box or glue (space) or `\kern` or `\vrule` etc.
\enditems
Example: The `Z = \int``_\Omega x^{2y} + z\, dx` generates
$Z = \int_\Omega x^{2y} + z\, dx$ and it is <math list> which consists from:
\begitems
* `Z` is math atom with empty exponent and subscript, class: Ord,
* `=` is math atom with empty exponent and subscript, class: Rel,
* `\int``_\Omega` is math atom with empty exponent and with subscript `\Omega`, class: Op,
* `x^{2y}` is math atom with exponent `2y` and empty subscript, class: Ord,
\begitems \let\_bullet=\circ
* `2` is math atom with empty exponent and subscript, class: Ord,
* `y` is math atom with empty exponent and subscript, class: Ord,
\enditems
* `+` is math atom with empty exponent and subscript, class: Bin,
* `z` is math atom with empty exponent and subscript, class: Ord,
* `\,` is other material, the glue (space) in this case,
* `d` is math atom with empty exponent and subscript, class: Ord,
* `x`is math atom with empty exponent and subscript, class: Ord.
\enditems
\secc[class] Classes of math atoms
\TeX/ assigns {\em a class} for each math atom.\fnote
{Using terminology of \TeX/book, each single math object has its {\em class} but the
math atom has its {\em kind} derived from this class. I use only one word
for both meanings in this document.}
This data type is used when
\TeX/ decides about horizontal spaces between atoms in the output. (Note
that spaces in the input are ignored.) For example,
`$xy$` prints two atoms without space between them but `$x+y$` is printed with
small spaces around the `+` binary operator. Compare: $xy$ and $x+y$.
The class is assigned depending on the nucleus of the atom. If the nucleus is
not single math object, i.e. it is constructed by `{<math list>}` with braces
then the atom has its class Ord. If the nucleus is single math object constructed
without braces then the class of the atom depends on this single math
object. Each single math object must be declared in \TeX/ with its default
class. The following table lists the classes with typical examples.
Full set of all math objects used in math typesetting
is listed in the section~\ref[objects] with their default classes.
\bigskip
\noindent\hfil\table{llll}{
& Class & Meaning & Example \crl
0 & Ord & ordinary object & variables, digits, $x, {\bbchar R}, \Gamma, 0, 1$ \cr
1 & Op & big opertator & $\sum, \int, \bigcup$ \cr
2 & Bin & binary operator & $+, \times, -, \pm, \cup$ \cr
3 & Rel & reations & $=, \ne, \leq, \supseteq, \succsim$ \cr
4 & Open & opening bracket & $\{, (, [, \langle$ \cr
5 & Close & closing bracket & $\}, ), ], \rangle$ \cr
6 & Punct & punctuation & comma \cr
& Inner & left-right & \code{\\left...\\right} outputs, see section~\ref[delims]
}
\bigskip
There are three space types used by the algorithm for horizontal spacing in the
math formulas.
\begitems
* Thin space: `\thinmuskip` primitive register, `\,` macro. Used around Op atoms.
* Medium space: `\medmuskip` primitive register, `\>` macro. Used around Bin atoms.
* Thick space: `\thickmusip` primitive register, `\;` macro. Used around Rel atoms.
\enditems
\puttext 7.8cm -3.7cm {\rotbox{90}{Left atom}}
\puttext 11.5cm -.5cm {Right atom}
\puttext 8.2cm -4.4cm {\typosize[9/11]
\thistable{\def\_enspace{ }}%
\table {l|8c|} {
\omit & Ord & Op & Bin & Rel & Open & Close & Punct & \omit \hfil Inner \crlp{2-9}
Ord & 0 & 1 & 2 & 3 & 0 & 0 & 0 & 1 \cr
Op & 1 & 1 & & 3 & 0 & 0 & 0 & 1 \cr
Bin & 2 & 2 & & & 2 & & & 2 \cr
Rel & 3 & 3 & & 0 & 3 & 0 & 0 & 3 \cr
Open & 0 & 0 & & 0 & 0 & 0 & 0 & 0 \cr
Close & 0 & 1 & 2 & 3 & 0 & 0 & 0 & 1 \cr
Punct & 1 & 1 & & 1 & 1 & 1 & 1 & 1 \cr
Inner & 1 & 1 & 2 & 3 & 1 & 0 & 1 & 1 \crlp{2-9}
}}
\hangindent=-8.7cm \hangafter=0
Ord atoms are printed without spaces between them. The spaces are not
cummulated, so the rules about spaces mentioned above is only rough idea.
The exact rule for horizontal spaces is given for each pairs of atoms
in the table here. The symbol 0 means no space, 1 thin space, 2 medium space
and 3 means thick space.
\hangindent=-8.7cm \hangafter-2
The Bin atom is automaticaly transformed to the
Ord atom if no atom precedes or if Op, Bin, Rel, Open or Punct atom
precedes. And it is transformed to the Ord atom if Rel, Close or Punct atom
follows. This corresponds to the empty cells in the table.
Why such behavior? Compare \"\hbox{$0-1$}" and \"$-1$". The Bin atom in
the second case behaves like Ord atom because it is {\em unary minus}.
There is no space between unary minus and one.
All medium spaces and thick spaces and some thin spaces from this table are
omitted if the <math list> is processed in script or scriptscript styles
(smaller size). See section~\ref[styles] about math styles.
You can overwrite the default class derived from the nucleus of the atom by
\TeX/ primitives `\mathord`, `\mathop`, `\mathbin`, `\mathrel`, `\mathopen`,
`\mathclose`, `\mathpunct` and `\mathinner`. They can precede a nucleus of
the atom and they set the class of the atom.
For example, `x \mathrel+ y` behaves like `x = y` in spacing point of view but +
is printed. Another example: `\mathop{\rm lim} z` creates the atom `lim` in
roman font of class Op. So, the thin space is inserted between lim and $z$.
There are more special kinds of math atoms: fractions, math accents,
radicals. They are constructed by special way (see next sections) but they behaves
like Ord atom in the horizontal spacing algorithm.
\secc[styles] Math styles
When a formula (or a sub-formula) is processed by \TeX/ then one from four
styles is active: display style ($D$), text style ($T$), script style ($S$) or
scriptscript style ($SS$).
The $T$ style is started in in-line math mode `$...$` and the $D$
style is started in display math mode `$$...$$`. The first level of exponents or
subscripts is processed in $S$ style and the second and more levels of
exponents or indexes are processed in $SS$ style.
There are special rules for math styles when fractions are constructed, see
section~\ref[frac].
The $D$ and $T$ style uses basic font size, $S$ uses smaller font size (typically
70~\%) and $SS$ style uses more smaller font size (typically 50~\%). Next
levels of \"more smaller fonts" are not used due to classical typographic rules.
The nucleus of Op atoms (big operators, $\sum$, $\int$, etc.) have typically bigger versions
of the character shape for $D$ style than for $T$ style.
So, there are four sizes for such math
objects: one size for each math style. All other math objects (with non Op
class) are printed only in three sizes: The sizes for $T$ and $D$ styles are equal.
The Op atom puts its exponent and subscript above and below the nucleus in $D$
style but right to the nucleus in other styles:
$$
`\sum``_{i=1}^\infty` \quad \hbox{gives}\quad \sum_{i=1}^\infty \hbox{ in $D$ style and}
\quad \textstyle \sum_{i=1}^\infty \hbox{ in $T$ style}.
$$
This default behavior of the Op atom
can be modified by placing `\limits` or `\nolimits` or
`\displaylimits` \TeX/ primitive just after the Op nucleus before the constructors
of exponent and/or index. The `\nolimits` puts exponent and subscript right
to the nucleus (regardless of the current style) and `\limits` puts these
objects above and below the nucleus (regardless of the current style). There
can be more such primitives in a queue (due to a macro expansion, for
instance). Then the last primitive in the queue wins.
If the last primitive is `\displaylimits` then
default behavior is processed regardless there are `\limits` or `\nolimits`
before it.
$$
`\sum\nolimits``_{i=1}^\infty` \quad \hbox{gives}\quad \sum\nolimits_{i=1}^\infty
\hbox{ in $D$ style and}\quad \textstyle\sum\nolimits_{i=1}^\infty
\hbox{ in $T$ style}.
$$
Atoms of all other classes have their exponents and/or subscripts only right
to their nucleus without any exception.
The primitives `\displaystyle`, `\textstyle`, `\scriptstyle` and
`\scriptscriptstyle` set the given style regardless the default rules. For
example, you can create a formula in in-line math mode and in $D$ style by
`$\displaystyle <fomula>$` or a formula in display mode and $T$ style can be printed
by `$$\textstyle <fomrula>$$`.
If the subformula is placed below something (below a rule from root symbol,
below a fraction rule), then the processed style $D, T, S$ or $SS$ is {\em cramped}.
The exponents are positioned slightly lower than in non-cramped style.
Several macros need to know what math style is currently processed (for
example they need to draw something in an appropriate size). But it
not possible simply due to the syntax of fractions (section~\ref[frac]).
This syntax requires to process all math lists in two steps: the first step
expands all macros and creates structured data of processed math list. The
second step reads the output of the first step, switches between math
styles and creates definitive output. So, macros (working in first step)
cannot know the current math
style because it is set only in the second step. \TeX/ supports the primitive
`\matchchioce{<D>}{<T>}{<S>}{<SS>}` which prepares four math lists in the
first step and only one of these four lists are used in the second step. We
can put different macros into each of the four parameters of `\mathchoice`.
Plain \TeX/ supports the macro `\mathpalette` which gives a more comfortable
interface of `\mathchoice` to macro programmer.
\new \OpTeX/
We describe another interface for creating macros depending on current
style. You can use `\mathstyles{<math list>}`. It
behaves like `{<math list>}`, moreover, you can use following commands inside such
<math list>:
\begitems
* The macro `\currstyle`. It expands to
`\displaystyle`, `\textstyle`,
`\scriptstyle` or `\scriptscriptstyle` depending on the current math style
when the `\mathstyles` was opened.
* The `\dobystyle{<D>}{<T>}{<S>}{<SS>}` is expandable macro. It expands its
parameter `<D>`, `<T>`, `<S>` or `<SS>` depending on the current math style
when `\mathstyles` was opened.
* The value of the `\stylenum` register is 0, 1, 2 or 3
depending on the current math style when `\mathstyles` was opened.
\enditems
%
Example of usage of `\mathstyles`:
\def\mysymbol{\mathbin\mathstyles
{\kern1pt\vrule height\mysymbolA width\mysymbolA\kern1pt}}
\def\mysymbolA{\dobystyle{5pt}{5pt}{3.5pt}{2.5pt}}
\begtt
\def\mysymbol{\mathbin\mathstyles
{\kern1pt\vrule height\mysymbolA width\mysymbolA\kern1pt}}
\def\mysymbolA{\dobystyle{5pt}{5pt}{3.5pt}{2.5pt}}
Test: $a\mysymbol b_{c \mysymbol d}$ or $a\mysymbol b\over c$.
\endtt
This example gives Test: $a\mysymbol b_{c \mysymbol d}$ or $a\mysymbol b\over c$.
The `\mathstyles` macro mentioned above uses \TeX/ primitive `\mathchoice`, so it
creates four math lists and only one is used. It may take more
computer time in special cases.
\new Lua\TeX/
Lua\TeX/ supports the `\mathstyle` primitive
(no \"`s`" at the end of this control sequence) which
expands to values 0 to 7 depending on the current style:
$D, D', T, T', S, S', SS, SS'$
(where $X'$ means cramped variant of the style). This primitive does
not use `\mathchoice` but it simply ignores the fraction syntax, so
`$a\mysymbol b\over c$` cannot work if `\mysymbol` is defined using the `\mathstyle`
primitive. See section 7.3.1 of Lua\TeX/ documentation for more information.
\secc[frac] Fractions
The fraction can be constructed by `{<numerator>\over<denominator>}`. If the
fraction is only single object in the whole math mode (between dollars),
you need not to use the outer braces, so you can write `$1\over2$` to get $1\over2$.
The <numerator> and <denominator> are printed in \"smaller" math style than
current math style. More exactly the following schema is used.
$D$: $T\over T$., $T$: $S\over S$, $S$: $SS\over SS$, $SS$: $SS\over SS$.
For example
$$
`{a+b \over c}` \quad \hbox{is printed as }
{a+b\over c} \hbox{ in $D$ style and as }
\textstyle {a+b\over c} \hbox{ in $T$ style}.
$$
The \LaTeX/ macro `\frac{<numerator>}{<denominator>}` is not supported in
Plain \TeX/ nor in \OpTeX/ but you can define such macro if you want.
The syntax with `\over` is more preferred because it is more human readable
notation. You can write the fraction in the same manner as you can read it.
You can compare: `$1\over2$` (one over two) with `$\frac12$` (frac twelve).
Besides the `\over` primitive, there are analogical \TeX/ primitives which
create \"generalized" fractions. The result is similar as `{<above>\over <below>}`
but there is something extra:
\begitems
* `{<above>\atop <below>}` does `{<above>\over<below>}` but
without the fractional rule.
* `{<above>\above<dimen><below>}` creates fractional rule with <dimen> thickness.
* `{<above>\overwithdelims<delim-l><delim-r><below>}` adds the <delim-l> left to
the fraction and the <delim-r> right to the fraction.
* `{<above>\atopwithdelims<delim-l><delim-r><below>}` is analogical to
`\overwithdelims` but without fractional rule.
* `{<above>\abovewithdelims<delim-l><delim-r><dimen><below>}` behaves as
`\overwithdelims` but the fractional rule has <dimen> thickness.
\enditems
%
The `\...withdelims` variants read <delim-l> and <delim-r>, they must be
declared as {\em math delimiter} in \TeX. They are vertically scalable
math objects, typically brackets. See section~\ref[delims] for more
information about math delimiters. Example:
$$
`{n \atopwithdelims() k}`\quad \hbox{ creates }
{n \choose k} \hbox{ in $D$ style and }
\textstyle {n \choose k} \hbox{ in $T$ style}.
$$
The `\choose` macro is defined by `\def\choose{\atopwithdelims()}`, so the
user can write `{n\choose k}` in order to get binomial coefficients.
\secc[delims] Vertically scalable objects: math delimiters
The vertically scalable objects are called {\em delimiters}. For example,
all types of brackets are declared as delimiters.
This means that you can use a bracket in arbitrary
vertical size.\fnote{
This is not exactly true, because traditional typography says that they
cannot be scaled continuously but by visible steps. This means that there is
a sequence of increasing brackets in the font, reader must see a difference
between each two sizes of brackets.}
The following objects are declared as delimiters (i.e.\ vertically scalable):
\bigskip
{\tt \adef!{\bslash}
\table{l 14c}{
\rm source: & ( & ) & [ & ] & \code{\\\{} & \code{\\\}} & /
& !backslash & !langle & !rangle
& | & \code{\\|} & \cr
\rm output: &$($&$)$&$[$&$]$& $\{$ & $\}$ & $/$
& $\backslash$ & $\langle$ & $\rangle$
& $|$ & $\|$
}
\medskip
\table{l 14c}{
\rm source: & !lfloor & !rfloor & !lceil & !rceil \cr
\rm output: & $\lfloor$ & $\rfloor$ & $\lceil$ & $\rceil$
}
\medskip
\table{l 14c}{
\rm source: & !uparrow & !Uparrow & !dowarrow & !Downarrow
& !updownarrow & !Updownarrow \cr
\rm output: & $\uparrow$ & $\Uparrow$ & $\downarrow$ & $\Downarrow$
& $\updownarrow$ & $\Updownarrow$
}}
\bigskip
\noindent \new Unicode
If you are able to produce the characters $\langle$, $\rangle$,\fnote
{Do not confuse $\string<, >$ and $\langle, \rangle$. The first pair are Rel atoms
with meaning \"less than" or \"greater than", but the second pair are special
types of brackets. They are not directly available at computer keyboards without
using a keyboard macro.}
$\lfloor$, $\rfloor$, ... $\updownarrow$, $\Updownarrow$
directly in your text editor then you can use these Unicode characters in your source instead of control
sequences `\langle`, `\rangle`, `\lfloor`, `\rfloor` ... `\updownarrow`, `\Updownarrow`.
For many users (including me), there is more simple to type `\lfloor` than to find
how to create the $\lfloor$ character in my text editor. Note that there exist
text editors (Emacs, for example)
enabling you to type `\lfloor` and this control sequence is immediately
converted to the $\lfloor$ Unicode character.
Your source looks pretty and you can use classical \TeX/ sequences.
\new Unicode
There are more delimiters, but it heavily depends on loaded Unicode Math
font. For example, this document is printed in `latinmodern-math` font and
there are six more delimiters `\lBrack`~$\lBrack$, `\rBrack`~$\rBrack$,
`\lAngle` $\lAngle$, `\rAngle` $\rAngle$, `\lgroup` $\lgroup$, `\rgroup` $\rgroup$.
See section~\ref[objects] for table of all Unicode symbols for math typesetting.
Arbitrary tall formula can be surrounded by a pair of delimiters using
`\left` and `\right` \TeX/ primitives: `\left<delim> <formula> \right<delim>`.
The delimiters are scaled to the height and depth of the <formula>
and vertically centered to the {\em math axis}.\fnote
{Math axis is a horizontal line passing through the center of symbols $+$
and $-$. All vertically scalable objects are vertically centered with
respect to this axis.}
Example:
$$
`+ \left\{ \sum_{i=1}^\infty x_i \right)` \quad \hbox{ gives }
+ \left\{ \sum_{i=1}^\infty x_i \right).
$$
The pair `\left<delim> <formula> \right<delim>` creates the formula in a
\TeX/ group. Such group can be nested with another groups.
Each `\left` must have its `\right` counterpart at the same group level.
If you don't want to create visible delimiter, use dot instead <delim>.
Example:
$$
`\left. \int``_0^t e^{x^2}\,dx\, \right|_{t=42}` \quad \hbox{ gives }
\left. \int_0^t e^{x^2} \,dx\, \right|_{t=42}
$$
\new e\TeX/
You can use `\middle<delim>` inside the <formula> which is surrounded by
`\left...\right`. Then the given <delim> is scaled to the same size like
their `\left` and `\right` counterparts.
When a delimiter is used without `\left` nor `\right` prefix, then it is the
Open, Close, Ord or Bin atom by its natural meaning:
$(, [, \{, \ldots, \lfloor, \lceil$ are Open atoms,
$], ], \}, \ldots, \rfloor, \rceil$ are Close atoms,
$/, \backslash, |, \|$ are Ord atoms and
$\uparrow, \Uparrow, \ldots, \Updownarrow$ are Bin atoms. You can overwrite
this default setting, for example `\mathclose(`. If delimiters are used with
`\left` and `\right` prefixes then `\left<delim>` behaves like Open atom,
`\right<delim>` behaves like Close atom and the math list
`\left<delim><formula>\right<delim>` is encapsulated as a single Inner atom.
The `\middle<delim>` behaves like Open atom at its left side and like Close
atom at its right side.
The sequence of increasing delimiters can be printed by the following
macros:
$$
`(` \to (,\quad `\big(` \to \big(,\quad `\Big(` \to \Big(,\quad
`\bigg(` \to \bigg(, \quad `\Bigg(` \to \Bigg(.
$$
The `\Bigg<delim>` is not maximal size of the bracket. Try
`\left(\vbox to5cm{}\right.`, for example. You can see that the font
\"cheats" from certain sizes, because there are not all infinity number of
sizes of brackets drawn in the font, of course.
The `\big<delim>` creates Ord atom. We need to create Open atom
for opening bracket and Close atom for closing bracket more often.
Then we can use macros
`\bigl<delim>`,
`\Bigl<delim>`,
`\biggl<delim>`,
`\Biggl<delim>` for creating Open atoms and
`\bigr<delim>`,
`\Bigr<delim>`,
`\biggr<delim>`,
`\Biggr<delim>` for creating Close atoms. Unfortunately, the source is not
too attractive when more sizes of brackets are used, but typographic
traditions say that we have to distinguish brackets by the size in math
mode if they are in equal types:
$$
`\Bigl( f\bigl( 2(x+y) + z\bigr) \Bigr)'` \quad \hbox{gives }
\Bigl(f\bigl(2(x+y)+z\bigr)\Bigr)'.
$$
\secc Horizontally scalable objects: math accents
Arbitrary wide formula can be covered by {\em scalable math accent}.
Example:
$$
`\overrightarrow {a+b+c+d+e+f}` \quad \hbox{gives } \overrightarrow {a+b+c+d+e+f}.
$$
The usage is: control sequence of selected math accent followed by `{<math list>}`.
Standard scalable math accents are:
`\overline` $\overline{abc}$,
`\overbrace` $\overbrace{abc}$,
`\overrightarrow` $\overrightarrow{abc}$,
`\overleftarrow`~$\overleftarrow{abc}$,
`\underline` $\underline{abc}$,
`\underbrace` $\underbrace{abc}$.
A Op atom is created. The exponents and subscripts are centered above
and below the nucleus of this atom (regardless of the current style). Example:
$$
`\overbrace {b\cdot b\cdot b \cdots b}^{k\times}` \quad \hbox{gives }
\overbrace {b\cdot b\cdot b \cdots b}^{k\times}
$$
There are scalable accents with limited maximum width:
`\widehat` $\widehat{abc}$ and `\widetilde` $\widetilde{abc}$. If the
formula is wider than the font is able to cover then widest variant from the
font is used and it is horizontally centered.
\new Unicode
There are more scalable accents in Unicode math fonts:
`\overparen` $\overparen{abc}$, `\underparen` $\underparen{abc}$,
`\overbracket` $\overbracket{abc}$, `\underbracket` $\underbracket{abc}$,
`\overleftrightarrow` $\overleftrightarrow{abc}$,
`\overleftharpoon` $\overleftharpoon{abc}$,
`\overrightharpoon` $\overrightharpoon{abc}$,
\secc Fixed math accents
Fixed math accents can be applied to single math object or to the `{<math list>}`.
The accent is centered (with respect of slanting axis) and the result is a
nucleus of Ord
atom. For example `\dot x` gives $\dot x$. The list of fixed math accents
follows: `\acute x` $\acute x$, `\bar x` $\bar x$,
`\breve x` $\breve x$, `\check x` $\check x$,
`\dot x` $\dot x$, `\ddot x` $\ddot x$,
`\grave x` $\grave x$, `\hat x` $\hat x$,
`\vec x` $\vec x$, `\tilde x` $\tilde x$.
\new Unicode
The additional fixed accents depends on used Unicode math font. The
`latinmodern-math` supports:
`\ovhook x` $\ovhook x$, `\ocirc x` $\ocirc x$,
`\leftharpoonaccent x` $\leftharpoonaccent x$, `\rightharpoonaccent x` $\rightharpoonaccent x$,
`\dddot x` $\dddot x$, `\ddddot x` $\ddddot x$,
`\widebridgeabove x` $\widebridgeabove x$, `\asteraccent x` $\asteraccent x$.
There exist one special math accent `'` (single quote, ASCII 39)
which can be appended after a symbol like this: `f'`
and it creates $f'$ (typical meaning is the
derivation of the given function). You can put more such accents, for
example `g'''` gives $g'''$.
\secc Roots
There is a macro `\sqrt{<math list>}` to create square root. For example:
$$
`\sqrt{\sqrt{\sqrt{x+1}+1}+1}` \quad \hbox{gives }
\sqrt{\sqrt{\sqrt{x+1}+1}+1}
$$
The $n$-th root is created by the macro `\root <n>\of{<math list>}`. For
example `\root k+1\of x` gives $\root k+1\of x$.
\secc Math alphabets
Letters $a\dots z$, $A\dots Z$ and $\alpha$\dots$\omega$ are printed in italic
in math mode. This follows the traditional typographic rule.
All other math symbols, digits and uppercase Greek letters must be
upright.\fnote
{French typographic convention says that uppercase Greek letters have to be
in italic too. Use `\_itGreek` declaration in this case.}
These rules are independent of the current variant of surrounding text font.
If we want to use the letters or digits
in another than this default shape, then we can use
{\em math alphabet selectors}: `\mit`, `\rm`, `\it`, `\bf`, `\cal`.
\new \OpTeX/
\OpTeX/ supports more such selectors `\script`, `\frak`, `\bbchar`, `\bi`, see
section 1.3.3 in the \OpTeX/ documentation. The math selectors have local
validity in the group.
The control sequences `\rm`, `\it`, `\bf`, and `\bi` act as variant selectors
of fonts in non-math mode (text mode) and they act
as math alphabet selectors in math mode. This \"overlaying" concept
is given by Plain \TeX/. Example: math operators lim, sin, cos,
log, etc.\ must be printed unslanted. We are using `\lim`, `\sin`, `\cos`,
`\log` etc.\ in math mode in order to comply this typographic convention. For
example `\sin` is defined as:
\begtt
\def\sin {\mathop{\rm sin}\nolimits}
\endtt
The `\rm` is used here as math alphabet selector, no variant selector of
text fonts.
The list of all predefined `\rm`-like math operators follows: `\arccos`,
`\arcsin`, `\arctan`, `\arg`, `\cos`, `\cosh`, `\cot`, `\coth`, `\deg`.
`\det`, `\dim`, `\exp`, `\gcd`, `\hom`, `\inf`, `\ker`, `\lg`, `\lim`,
`\liminf`, `\limsup`, `\ln`, `\log`, `\max`, `\min`, `\Pr`, `\scs`, `\sin`,
`\sinh`, `\sup`, `\tan`, `\tanh`, You can define another such operator
analogically.
\new Unicode
Unicode font can include the following math alphabets:
\begtt \typosize[9/11]
\_rmvariables % upright letters A-Z, a-z
\_bfvariables % bold letters A-Z, a-z
\_itvariables % italic letters A-Z, a-z
\_bivariables % bold italic letters A-Z, a-z
\_calvariables % calligraphic letters A-Z, a-z
\_bcalvariables % calligraphic letters A-Z, a-z
\_frakvariables % fraktur A-Z, a-z
\_bfrakvariables % bold fraktur A-Z, a-z
\_sansvaraibales % sans serif letters A-Z, a-z
\_bsansvaraibales % bold sans serif letters A-Z, a-z
\_isansvaraibales % slanted sans serif letters A-Z, a-z
\_bisansvaraibales % bold slanted sans serif letters A-Z, a-z
\_ttvariables % monospace, typewriter letters A-Z, a-z
\_bbvariables % double struck A-Z, a-z
\_rmdigits % upright digits 0..9
\_bfdigits % bold digits 0..9
\_sansdigits % sans serif digits 0..9
\_bsansdigits % bold sans serif digits 0..9
\_ttdigits % monospace typewriter digits 0..9
\_bbdigits % double-struck digits 0..9
\_rmgreek % upright Greek letters \alpha-\omega
\_itgreek % slanted Greek letters \alpha-\omega
\_bfgreek % bold Greek letters \alpha-\omega
\_bigreek % bold italic Greek letters \alpha-\omega
\_bsansgreek % bold sans serif Greek letters \alpha-\omega
\_bisansgreek % bold slanted snas serif Greek letters \alpha-\omega
\_itGreek % slanted Greek letters \Alpha-\Omega
\_bfGreek % bold Greek letters \Alpha-\Omega
\_biGreek % bold italic Greek letters \Alpha-\Omega
\_bsansGreek % bold sans serif Greek letters \Alpha-\Omega
\_bisansGreek % bold slanted snas serif Greek letters \Alpha-\Omega
\endtt
%
Not all Unicode math fonts include all math alphabets listed here. Typically,
the lowercase letters of calligraphic shape and all letters of
bold calligraphic shape are missing.
\new \OpTeX/
\OpTeX/ defines internal math alphabet selectors as mentioned in the
previous listing of math alphabets and sets as default:
\begtt \typosize[10/12]
\_itvariables \_rmdigits \_itgreek \_rmGreek
\endtt
%
Moreover, it defines the alphabet selectors at user level (see section 1.3.3
of the \OpTeX/ manual). For example
\begtt \typosize[10/12]
\def\rm {\_tryload\_tenrm \_inmath{\_rmavariables \_rmdigits}}
\endtt
%
The first part
\new \OpTeX/
`\_tryload\_tenrm` is applicable for text fonts and the
`\_inmath` part is processed only in math mode and sets the math alphabets.
You can see the file `unimath-codes.opm` where all user level selectors are
defined. You can redefine them. For example, \OpTeX/ defines `\bf` as a math
alphabet selector which selects sans serif bold in math. This is common
notation for vectors, tensors and matrices. If you dislike this, then you can define:
\begtt \typosize[10/12]
\def\bf {\_tryloadbf\_tenbf \_inmath{\_bfvariables\_bfdigits\_bfgreek\_bfGreek}}
\endtt
\secc[objects] List of single math objects
\new Unicode
All single math objects are listed in the `unimath-table.opm` or
`unicode-math-table.tex` file. You can
look into this file. The codes, \TeX/ sequences, classes and comments
for all possible math codes are here. Maybe, your Unicode math font which is loaded,
does not support all these codes.
\new \OpTeX/
You can try all codes of currently loaded font by
\begtt
\input print-unimath.opm
\endtt
The `unimath-table` is printed with characters available in loaded font.
\new \OpTeX/
If the character is unsupported by the font then the slot is empty and only
\TeX/ sequence and the class of the code is printed in the table.
For example, this document loads `latimodern-math.otf` font.
And the result from `\input print-unimath.opm` looks like the following ten
pages.
\bigskip
\input print-unimath.opm
\bigskip
It isn't very comfortable to find something in the previous table
if you know the shape. You can try the online web tool
\ulink[https://detexify.kirelabs.org/classify.html]{Detexify}.
You can draw the symbol here and the suggestion of \TeX/ sequence is
printed.
\def\g#1{{\tt\string#1}~$#1$}
The generic \TeX/ sequences for the Greek letters can be used:
\g\alpha, \g\beta, \g\gamma, \g\delta, \g\varepsilon, \g\zeta, \g\eta,
\g\theta, \g\iota, \g\kappa, \g\lambda, \g\mu, \g\nu, \g\xi,
\g\omicron, \g\pi, \g\rho, \g\varsigma, \g\sigma, \g\tau, \g\upsilon,
\g\varphi, \g\chi, \g\psi, \g\omega, \g\vardelta, \g\epsilon, \g\vartheta,
\g\varkappa, \g\phi, \g\varrho, \g\varpi\
and
\g\Alpha, \g\Beta, \g\Gamma, \g\Delta, \g\Epsilon, \g\Zeta, \g\Eta, \g\Theta,
\g\Iota, \g\Kappa, \g\Lambda, \g\Mu, \g\Nu, \g\Xi, \g\Omicron, \g\Pi, \g\Rho,
\g\Sigma, \g\Tau, \g\Upsilon, \g\Phi, \g\Chi, \g\Psi, \g\Omega.
\new \OpTeX/
The variant of Greek letters in the output
(upright, italic, bold, bold sans serif, etc.)
written by the sequences `\alpha`, `\beta` etc. depends on the math alphabet
selected by `\_itgreek`, `\_rmgreek`, etc. selectors. The user-level
selectors `\bf` and `\bi` set `\_bsansgreek` and `\_bisansgreek`, so
`{\bi\delta}` produces $\bi\delta$.
\new Unicode
All characters available in the math font can be accessed by \TeX/ control
sequence or by direct using the Unicode character in the document source.
Example:
\begtt \adef/{}
$$
\sum/_{k=0}^\infty e^{(\alpha+i\beta/_k)} =
e^\alpha \sum/_{k=0}^\infty e^{i\beta/_k} =
e^\alpha \sum/_{k=0}^\infty (\cos\beta/_k + i\sin\beta/_k).
$$
\endtt
or
\begtt \ttspec
$$
∑_{k=0}^∞ e^{(α + iβ_k)} = e^α ∑_{k=0}^∞ e^{iβ_k}
= e^α ∑_{k=0}^∞ (\cos β_k + i\sin β_k).
$$
\endtt
both gives the same result:
$$
∑_{k=0}^∞ e^{(α + iβ_k)} = e^α ∑_{k=0}^∞ e^{iβ_k}
= e^α ∑_{k=0}^∞ (\cos β_k + i\sin β_k).
$$
\medskip
\sec Other specialities
\secc The `\not` prefix
You can apply `\not` to the following math object.
The slash $/$ is overprinted such math object, for example
`$a \not= b$` gives $a \not= b$.
\new \OpTeX/
If there exist a direct Unicode character for negation of a relation symbol
(for example `\ne` creates $\ne$ directly as a character U+2260)
then `\not<char>` expands to appropriate Unicode character.
For example `\not=` expands to `\ne` or `\not\in` expands to `\notin`.
If such character does not exist then
the centered $/$ is overprinted over the next character.
\secc The `\buildrel` macro: text over relation
The macro `\buildrel <text>\over <relation>` creates a new atom Rel with the
<relation> and with the smaller <text> above this <relation>. Example:
`$M \buildrel\rm def\over= X\cup Y$` gives $M\buildrel\rm def\over= X\cup Y$.
\secc Spaces
Spaces between atoms are created automatically as were mentioned in
section~\ref[class]. But sometimes you have to help \TeX/ to create
appropriate space. You can use following macros:
\begitems
* `\,` is {\em thin space} used around Op atoms, after comma, etc.: \ss\,,
* `\!` is negative thin space,
* `\>` is {\em medium space} used around Bin atoms: \ss\>,
* `\;` is {\em thick space} used around Rel atoms: \ss\;,
* `\quad` is {\em em space}: \ss\quad,
* `\qquad` is {\em double em space}: \ss\qquad.
\enditems
%
Of course, you can use {\em direct space} {\visiblesp`\ `} which is \TeX/ primitive
and gives interword space: \ss\ \
or you can use `\hskip <value>` to put arbitrary space.
The space size of `\,`, `\!` resp. `\>`, resp. `\;` is given by
`\thinmuskip`, resp. `\medmuskip`, resp. `\thickmuskip` values. You can see
in the `plain.tex` file that these default values differ very little in their basic
size but there is no stretchability/shrinkability in the `\,` space, there is small
stretchability in the `\>` space and more stretchability in the `\;` space.
The registers `\thinmuskip`, `\medmuskip` and `\thickmuskip` store so called
{\em mu values} given by math unit `mu`. It is 1/18 em and this unit depends
on the current font size used in the math formula ($S$ or $SS$ styles use
smaller font size, the `mu` unit is smaller here). You can use `\muskip`
instead `\hskip` or `\mukern` instead `\kern` if you want to use this
special mu unit. It is allowed only in math mode.
The `\quad` and `\qquad` spaces have fixed width and they can be used in text
mode too. (\OpTeX/ allows to use `\,` in text mode too).
Use `\quad` or `\qquad` if you want to separate more formulas created in
single math mode. Examples of typical usage of spaces:
\begtt \adef/{} \typosize[10/12]
$$ \alpha\,(x+y), \qquad \int/_a^b \!\! f(x)\,{\rm d}x, \qquad \Gamma/_{\!i}. $$
\endtt
$$ \alpha\,(x+y), \qquad \int_a^b \!\! f(x)\,{\rm d}x, \qquad \Gamma_{\!i}. $$
\secc Texts in math mode
If you write `$Hello world!$` (i.e.\ Hello world in math mode), then you get
$Hello world!$. It is interpreted as product of variables $H$ and $e$ and
$l^2$ and $o$ etc., followed by the symbol ! used for factorial.
The non-ASCII letters (with accents) don't work at all because they are
never used as symbols for variables. Spaces are ignored.
If you want to write a short text in the math mode, then you can use
`\hbox{<text>}`. The `\hbox` primitive initializes text mode regardless of
the \"outer mode". Example:
\begtt \adef/{} \typosize[10/12]
$$ \sum/_{n=0}^\infty (-1)^n a_n \hbox{ converges, if $a_n\searrow 0$.} $$
\endtt
$$ \sum_{n=0}^\infty (-1)^n a_n \hbox{ converges, if $a_n\searrow 0$.} $$
%
Note the space before the word \"converges". The space before `\hbox` is
irrelevant. Second notice: the example shows the text mode inside math mode
and the in-line math mode inside this text mode. The same result can be
produced by:
\begtt \adef/{} \typosize[10/12]
$$ \sum/_{n=0}^\infty (-1)^n a_n \hbox{ converges, if } a_n\searrow 0. $$
\endtt
%
The difference can be visible if the formula $a_n\searrow 0$ includes a
fraction, for example ${1\over2}a_n\searrow 0$. The first example prints the
fraction in the text style and the second example prints it in the display style.
The disadvantage of `\hbox` is that it starts in the text mode independently
of the current style, but we want to use smaller font in $S$ or $SS$ styles.
\new \OpTeX/
You can use `\mathbox{<text>}` in such situations. This macro behaves like
`\hbox` but the text is appropriately smaller in $S$ and $SS$ styles.
Example:
$$
`{\mathbox{cena}\over\mathbox{výkon}}` \quad \hbox{gives }
{\mathbox{cena}\over\mathbox{výkon}} \hbox{ in $D$ style and }
\textstyle {\mathbox{cena}\over\mathbox{výkon}} \hbox{ in $T$ style.}
$$
Note that $\mathbox{cena}\over\mathbox{výkon}$ means $\rm price\over performance$
and you can write `$\rm price\over performance$` when you are using only
words without spaces and accented letters. But phrases with spaces or accented letters
should be printed in text mode using `\hbox` or `\mathbox`.
\secc `\vcenter`
The `\vcenter` primitive behaves like `\vbox`, but it can be used only in
math mode and its result is vertically centered to the math axis.
For example, matrices, are created by tables in `\vcenter`.
All big objects in math formula is centered to math axis and the baseline is
ignored. In the following example we create a new big math operator by
`\vcenter`:
\begtt
$$
\def\myop#1{\mathop{\vcenter{\frame{\vbox to2em{\vss\hbox{ $#1$ }\vss}}}}}
F(x) = \myop{x(i)}_{i=1}^\infty
$$
\endtt
\vskip-2em
$$
\def\myop#1{\mathop{\vcenter{\frame{\vbox to2em{\vss\hbox{ $#1$ }\vss}}}}}
F(x) = \myop{x(i)}_{i=1}^\infty
$$
\secc Three dots
You can write `$1,2,\dots,n$` to get $1,2,\dots,n$. The `\dots` macro puts
thin space between dots and after the last dot, so the five object: comma,
dots, comma are exactly equidistant.
Typographic conventions say that you have to use the repeating symbol
before and after three dots (comma in previous example) and the three dots
should be at baseline, if the repeating symbol is at baseline. Or they should be
at math axis, if the repeating symbol is at math axis. We have to use `\cdots` instead
`\dots` in second case. Example:
$$
`a_1, a_2, \dots, a_n, \quad a_1 + a_2 + \cdots + a_n` \qquad
a_1, a_2, \dots, a_n, \quad a_1 + a_2 + \cdots + a_n
$$
\vskip-.7em
There are `\vdots` $\vdots$, `\ddots` $\ddots$ and `\adots` $\adots$ which
can be used in matrices.
\new Unicode
Three dots like the output of the `\dots` macro are present as a single
character in fonts too. This character is called ellipsis. Font designers
typically suggest this character with smaller spaces between dots than we
need in math mode. So the rule about equidistant \"comma, three dots, comma"
is not met when this character is used. You can try `$1,2,\unicodeellipsis, n$`
and `$1+2+\unicodecdots + n$`. You get $1,2,\unicodeellipsis, n$ and
$1+2+\unicodecdots + n$. If you feel that this is better, then you can set:
`\let\dots=\unicodeellipsis \let\cdots=\unicodecdots`.
The Unicode fonts includes compact variants `\unicodevdots` $\unicodevdots$,
`\unicodeddots` $\unicodeddots$ and `\unicodeadots` $\unicodeadots$ too.
\secc Phantoms and `\smash`
The `\phantom{<math list>}` macro creates an invisible subformula equal to
the formula generated by <math list>. It has its size, so it can
interfere with surrounding visible subformulas. This macro is very useful for
aligning with special requirements. Examples are shown in
sections~\ref[matrix] and~\ref[elines].
The `\vphantom{<math list>}` has only its vertical size (i.e.\ its height
and depth), the width is zero. The `\hphantom{<math list>}` has only its
width.
The `\smash{<math list>}` is the opposite of `\vphantom`. It creates visible
subformula but it has only its width. Its height and depth are zero.
The result of these macros is the nucleus of an Ord atom. You can use `\mathop`,
`\mathbin`, etc. primitives to change this class. For example
`$a\mathrel{\phantom{=}}b$` creates the same formula as $a=b$ with the same
distance from $a$ to $b$ but without the equal sign:
$a\mathrel{\phantom{=}}b$.
These macros work in the text mode too. Then their argument is
the <horizontal list>.
\sec Structured objects
\secc[matrix] Matrices
The macro `\matrix{<data>}` creates a vertically centered table of items.
The <data> includes <items> separated by `&` and rows are separated by
`\cr`. The number of columns and rows are unlimited. Columns are printed centered
and separated by the `\quad` space. The vertically scalable
brackets around the table are not printed. You can use `\pmatrix{<data>}`
instead `\matrix{<data>}`: the vertically scalable parentheses () are inserted
around the table. Examples:
\begtt
$$
{\bf A} = \pmatrix{a_{1,1} & a_{1,2} & \cdots & a_{1,n} \cr
a_{2,1} & a_{2,2} & \cdots & a_{2,n} \cr
\vdots & \vdots & \ddots & \vdots \cr
a_{m,1} & a_{m,2} & \cdots & a_{m,n} },
$$
\endtt
$$
{\bf A} = \pmatrix{a_{1,1} & a_{1,2} & \cdots & a_{1,n} \cr
a_{2,1} & a_{2,2} & \cdots & a_{2,n} \cr
\vdots & \vdots & \ddots & \vdots \cr
a_{m,1} & a_{m,2} & \cdots & a_{m,n} },
$$
or:
\begtt
\def\qmatrix[#1]{\left[\matrix{#1}\right]}
$$
\qmatrix[a&b&c\cr d&e&f\cr g&h&i] \cdot \qmatrix[x_1\cr x_2\cr x_3]
= \qmatrix[b_1\cr b_2\cr b_3].
$$
\endtt
$$
\def\qmatrix[#1]{\left[\matrix{#1}\right]}
\qmatrix[a&b&c\cr d&e&f\cr g&h&i] \cdot \qmatrix[x_1\cr x_2\cr x_3]
= \qmatrix[b_1\cr b_2\cr b_3].
$$
If you need to aling the columns by another way than to center, then you can
use phantom. Compare:
\begtt
$$
\pmatrix{ 1 & -1 & 0 \cr
0 & 2 & 13 \cr
-3 & 0 & 5 } \quad \hbox{or} \quad
\def\0{\phantom0} \def\+{\phantom+}
\pmatrix { \+1 & -1 & \00 \cr
\+0 & \+2 & 13 \cr
-3 & \+0 & \05 }
$$
\endtt
$$
\pmatrix{ 1 & -1 & 0 \cr
0 & 2 & 13 \cr
-3 & 0 & 5 } \quad \hbox{or} \quad
\def\0{\phantom0} \def\+{\phantom+}
\pmatrix { \+1 & -1 & \00 \cr
\+0 & \+2 & 13 \cr
-3 & \+0 & \05 }
$$
\new\OpTeX/
Another option to set right aligned matrix is setting the `\lmfil`:
Its value is used at left side in each `\matrix` item. The right side is
set directly to `\hfil`.
\begtt
$$
\lmfil={\hfill} % left matrix filler = \hfill
\pmatrix{ 1 & -1 & 0 \cr 0 & 2 & 13 \cr -3 & 0 & 5 }
$$
\endtt
\new \OpTeX/
If you want to draw a vertical line inside the matrix, you can use `\adef|`
as in the following example:
\begtt
$$
\adef|{\kern-.2em&\strut\vrule&\kern-.2em}
\def\+{\phantom+}
\pmatrix{1 & 2 & 3 | 0 \cr 4 & 5 & 6 | 1 \cr 7 & 8 & 9 | 2 } \sim
\pmatrix{1 & \+2 & \+3 | 0 \cr 0 & -3 & -6 | 1 \cr 0 & -6 & -12 | 2} \sim
\pmatrix{1 & 2 & 3 | 0 \cr 0 & 1 & 2 | -1/3 \cr 0 & 0 & 0 | 1 }
$$
\endtt
$$
\adef|{\kern-.2em&\strut\vrule&\kern-.2em}
\def\+{\phantom+}
\pmatrix{1 & 2 & 3 | 0 \cr 4 & 5 & 6 | 1 \cr 7 & 8 & 9 | 2 } \sim
\pmatrix{1 & \+2 & \+3 | 0 \cr 0 & -3 & -6 | 1 \cr 0 & -6 & -12 | 2} \sim
\pmatrix{1 & 2 & 3 | 0 \cr 0 & 1 & 2 | -1/3 \cr 0 & 0 & 0 | 1 }
$$
If you want to put something before opening bracket in the matrix, you can
use another `\matrix`. Example:
\begtt
$$
\adef|{\kern-.2em&\strut\vrule&\kern-.2em}
\def\+{\phantom+}
\def\r{{\bf r}}
\pmatrix{1 & 2 & 3 | 0 \cr 4 & 5 & 6 | 1 \cr 7 & 8 & 9 | 2 } \ \sim \
\matrix{\cr 2.\r - 4\cdot 1.\r: \cr 3.\r -7\cdot 1.\r: }
\pmatrix{1 & \+2 & \+3 | 0 \cr 0 & -3 & -6 | 1 \cr 0 & -6 & -12 | 2}
$$
\endtt
$$
\adef|{\kern-.2em&\strut\vrule&\kern-.2em}
\def\+{\phantom+}
\def\r{{\bf r}}
\pmatrix{1 & 2 & 3 | 0 \cr 4 & 5 & 6 | 1 \cr 7 & 8 & 9 | 2 } \ \sim \
\matrix{\cr 2.\r - 4\cdot 1.\r: \cr 3.\r -7\cdot 1.\r: }
\pmatrix{1 & \+2 & \+3 | 0 \cr 0 & -3 & -6 | 1 \cr 0 & -6 & -12 | 2}
$$
Plain \TeX/ defines the `\bordermatrix` macro which allows you to create a
top row above the brackets and left column before the opening bracket.
\TeX/book shows the following example:
\begtt
$$
M = \bordermatrix{ &C&I&C'\cr
C&1&0&0 \cr I&1-b&0 \cr C'&0&a&1-a }
$$
\endtt
$$
M = \bordermatrix{ &C&I&C'\cr
C&1&0&0 \cr I&1-b&0 \cr C'&0&a&1-a }
$$
The `\matrix` macro used in $D$ style creates all its items in $T$ style.
\new \OpTeX/
If you are using the `\matrix` macro in $T$ style or $S$ style (but not in
fractions nor another matrices) then the resulting table is appropriately
smaller and all its items are processed in $S$ style.
If you are using `\matrix` in $SS$ style then the items are in $SS$ style too.
The following example shows one-column matrix in script style:
$$
`\sum``_{\matrix{i\in M\cr j\in N\cr k\in P}} x_{i,j,k}` \ \hbox{ creates: }
\sum_{\matrix{i\in M\cr j\in N\cr k\in P}} x_{i,j,k}
$$
\secc Cases
The `\cases` macro can be used as in the following example:
\begtt
$$
f(x) = \cases{ 1 & for $x\le 0$, \cr
100-x\over 100 & when $0 < x \le 100$, \cr
0 & in other cases. }
$$
\endtt
$$
f(x) = \cases{ 1 & for $x\le 0$, \cr
100-x\over 100 & when $0\string< x\le 100$, \cr
0 & in other cases. }
$$
The `\cases` macro behaves like a special `\matrix` with two left aligned
columns and with left vertically scaled brace $\{$.
First column is processed in math mode and $T$ style, second column
is processed in text mode. We have to use `$...$` in the second column if
there is a math material.
\sec Lines in display mode
\secc General principles
The `$$<formula>$$` finalizes previous paragraph, prints centered <formula> on
single line with a vertical space above and below and opens next paragraph
with no indentation.
From \TeX/'s point of view, the text above plus `$$<formula>$$` plus text
below is single paragraph interrupted by display <formula>. If there is no
text above (i.e. the opening `$$` are in vertical mode), then the internal
`\noindent` is processed first and empty line above <formula> is created.
Thus, it is definitely bad idea to open display mode in vertical mode: never
put empty line before `$$<formula>$$`. On the other hand, the empty line
just after `$$<formula>$$` says that the paragraph is finalized by the
<formula> and the next text (after the empty line) opens next paragraph with
indentation. Summary:
\begitems
* \"Text above `$$<formula>$$` text below": the <formula> interrupts the
paragraph with \"Text above" and \"text below". The \"text below" is
without indentation.
* \"Text above `$$<formula>$$` empty line Text below": the \"Text below"
opens new paragraph with indentation.
* \"Empty line `$$<formula>$$`" is bad practice.
\enditems
In contrast with the paragraph breaking, there is no built-in algorithm for
breaking display <formula> to more lines. If the <formula> is too wide then
overfull `\hbox` occurs and human must decide about splitting the <formula>
to more lines. The macros `\displaylines` and `\eqalign` are intended to
such task, see sections~\ref[dlines] and~\ref[elines].
On the other hand, the in-line math <formula>, i.e.\ the `$<formula>$` in a
paragraph, can be broken after a Bin atom (with penalty `\binoppenalty`) or
after a Rel atom (with penalty `\relpenalty`). If you don't want to break
such formula at a specific place then use `\nobreak`, for example
`$a+\nobreak b$`. If you want never to break such formulas then you can set
`\binoppenalty=10000`, `\relpenalty=10000`. (Default values are 700 and 500.)
\secc References to display lines
The `$$<formula>\eqno<mark>$$` prints centered <formula> and the <mark> at
right margin. The `$$<formula>\leqno<mark>$$` prints centered <formula> and
the <mark> at left margin. Examples:
\begtt
$$ a^2 + b^2 = c^2 \eqno (1) $$
\endtt
$$
a^2 + b^2 = c^2 \eqno (1)
$$
\begtt \aftergroup\nobreak
$$ a^2 + b^2 = c^2 \leqno \rm Py $$
\endtt
$$\predisplaypenalty=10000
a^2 + b^2 = c^2 \leqno \rm Py
$$
The <mark> is processed in math mode and $T$ style. If you want to put a
text here then you have to use `\rm <text>` or `\hbox{<text>}`.
\new \OpTeX/
The auto-generated <mark> can be created by `$$<formula>\eqmark$$`. The
<label> previously declared by `\label[<label>]` can be used.
Then it is associated to such
auto-generated <mark> and you can write a reference in the form
`see equation~\ref[<label>]`. You can write `\eqmark[<label>]` instead of
`\label[<label>]...\eqmark`. See the \OpTeX/ manual, section~1.4.3.
\secc[dlines] The `\displaylines` macro
This macro creates more horizontally centered formulas in one display mode.
The syntax is
\begtt \catcode`\<=13
$$ \displaylines{
<formula> \cr
<formula> \cr
... \cr
<formula>
} $$
\endtt
Usage of `\displaylines` is more
prefered than doing more display modes just behind each other.
Example:
\begtt
$$ \displaylines{
(3x^3 + 4x^2 + 5x + 6) \cdot (x^6 + x^2 + 5) = \cr
= 3x^9 + 4x^8 + 5x^7 + 6x^6 + 3x^5 + 4x^4 + 20x^3 + 26x^2 + 25x + 30.
} $$
\endtt
$$ \displaylines{
(3x^3 + 4x^2 + 5x + 6) \cdot (x^6 + x^2 + 5) = \cr
= 3x^9 + 4x^8 + 5x^7 + 6x^6 + 3x^5 + 4x^4 + 20x^3 + 26x^2 + 25x + 30.
} $$
The output from `\displaylines` macro is breakable to more pages because
the lines are not encapsulated in one box. The macro uses a special feature of
`\halign` primitive. The disadvantage is that you cannot use `\eqno` nor
`\leqno` nor `\eqmark`.
\new \OpTeX/
\OpTeX/ provides alternative form: `\displaylines to<dimen> {<data>}`.
Then the centered formulas are encapsulated in a `\vcenter` box of width <dimen> and
usage of `\eqno` or `\leqno` or `\eqmark` is allowed.
The individual lines have the form `\hbox to<dimen>` and formulas are centered using
`\hss` from both sides. This means that you can set arbitrary <dimen>
without visual change of the formulas. Use smaller <dimen> value than
`\hsize` (or `\displaywidth`\fnote
{`\displaywith` = `\hsize` in most cases but it is
real display width when `\parshape` or `\hangindent` is used.})
if you want to center formulas with `\eqno` appended.
The internal \TeX/ rule says: the formula with `\eqno` (or `\leqno`) is centered
if its width is less or equal `\displaywidth-4<mark-width>`. So
\begtt \catcode`\<=13
$$ \displaylines to\hsize-8em {<formula>\cr<formula>}\eqno (1) $$
\endtt
does global centering, because size of `(1)` is less than 2\,em.
You can do more experiments with this example,
for example `\diplaylines to\hsize{...}`
puts the `\eqno` mark to the next line in the display environment. Read
\TeX/book or \TeX/book naruby, where the precise explanation about such
positioning is.
\new \OpTeX/
You can use \"`\displaylines to<dimen>`" for more applications. For example,
you can put more
\"`\displaylines to<dimen>`" in single display mode, one next to second in order
to creating more centered columns with formulas; the width of such columns
are controlled by the <dimen> parameter.
Or, you can give an exception for first and last formula:
\begtt \catcode`\<=13
$$\displaylines to 10cm {<formula>\hfill \cr
<formula>\cr
<formula>\cr
\hfill <formula>}
$$
\endtt
The example above gives similar result as the \LaTeX/ `multline` environment:
$$\displaylines to \hsize {
(3x^3 + 4x^2 + 5x + 6) \cdot (x^6 + x^2 + 5) = \hfill \cr
= 3x^9 + 3x^5 + 15x^3 + 4x^8 + 4x^4 + 20x^2 + 5x^7 + 5x^3 + 25x
+ 6x^6 + 6x^2 + 30 = \cr
\hfill = 3x^9 + 4x^8 + 5x^7 + 6x^6 + 3x^5 + 4x^4 + 20x^3 + 26x^2 + 25x + 30. }
$$
\secc[elines] The `\eqalign` macro
The usage is:
\begtt \catcode`\<=13
$$ \eqalign { <left-side> & <right-side> \cr
<left-side> & <right-side> \cr
... \cr
<left-side> & <right-side>
} $$
\endtt
The `\vcenter` box is created with two columns, left column is right aligned
and right column is left aligned. Example:
\vbox{
\begtt
$$ \eqalign{
x + 2y + 3z &= 600 \cr
12x + y - 3z &= 7 \cr
4x - y + 5z &= -5 \cr
} $$
\endtt
\vskip-5.7\baselineskip
{\hsize=1.35\hsize
$$ \eqalign{
x + 2y + 3z &= 600 \cr
12x + y - 3z &= 7 \cr
4x - y + 5z &= -5 \cr
} $$}}
\bigskip\noindent
The tab \"`&`" should be used just before a relation, i.e. `&=` is right, `=&`
is wrong. All lines are aligned to the used tab.
Maybe you want more precise alignment in the example above. You can use
`\phantom`:
\par\nobreak\vbox{
\begtt
$$ \def\1{\phantom1} \def\+{\phantom+}
\eqalign{
x + 2y + 3z &= 600 \cr
12x + \1y - 3z &= \+7 \cr
4x - \1y + 5z &= -5 \cr
} $$
\endtt
\vskip-5.7\baselineskip
{\hsize=1.35\hsize
$$ \def\1{\phantom1} \def\+{\phantom+}
\eqalign{
x + 2y + 3z &= 600 \cr
12x + \1y - 3z &= \+7 \cr
4x - \1y + 5z &= -5
} $$}}
\bigskip
Another typical usage of the `\eqalign` macro:
\begtt \typosize[10/12]
$$ \eqalign{
p(x)\,q(x) &= (3x^3 + 4x^2 + 5x + 6) \cdot (x^6 + x^2 + 5) = \cr
&= 3x^9 + 4x^8 + 5x^7 + 6x^6 + 3x^5 + 4x^4 + 20x^3 + 26x^2 + 25x + 30.
} $$
\endtt
$$ \eqalign{
p(x)\,q(x) &= (3x^3 + 4x^2 + 5x + 6) \cdot (x^6 + x^2 + 5) = \cr
&= 3x^9 + 4x^8 + 5x^7 + 6x^6 + 3x^5 + 4x^4 + 20x^3 + 26x^2 + 25x + 30.
} $$
In \OpTeX/, \new\OpTeX/
the `\eqalign` macro is more flexible. You can set the
`\baselineskip` value by the `\eqlines` parameter and math style
by the `\eqstyle` parameter.
For example, you need to put the system of \"equations" as an subscript of sum
operator:
\begtt \typosize[10/12] \adef/{}
$$
\sum/_{\eqlines{\baselineskip=.7\baselineskip}\eqstyle{\scriptstyle}\eqalign{
i &\in A \cr
\quad j &\in B\cup C \cr
m &\in C }}
i + j + m
$$
\endtt
$$
\sum_{\eqlines{\baselineskip=.7\baselineskip}\eqstyle{\scriptstyle}\eqalign{
i &\in A \cr
\quad j &\in B\cup C \cr
m &\in C }}
i + j + m
$$
\indent \new\OpTeX/
You can write more equation systems one next second:
\begtt
$$\eqalign{
x + y + z &= 1 && a + b + c &= -1 \cr
u + v &= 20 && f + g &= -20 \cr
i &= j
}$$
\endtt
You can use the third column for centered equations
without aligning point. For example:
\begtt \catcode`\<=13
$$ \left( \eqspace=0pt \eqalign{&& <first equation>\cr
&& <second equation>} \right) $$
\endtt
The `\eqspace` is additional space used in the third column to separate
equation systems one next second.
\new \OpTeX/
\OpTeX/ extensions summary:
\begitems
* `\eqlines` and `\eqstyle` set baselineskip and math style of the formulas.
* `\eqalign` allows more than two columns:
First column is right aligned (no space). Second is left aligned (no space).
Third column (if used)
is centered with `\eqspace/2` at left and right boundary of the column.
Fourth is the same as first. Fifth is the same as second etc. The number
of columns which can be used in `\eqalign` is unlimited.
\enditems
\secc The `\eqalign` macro with references
You can give common mark to whole equation system by
`$$\eqalign{<data>}\eqno <mark>$$`. If you want to give marks to individual
lines of the equation system, then you can use another macro:
`\eqalignno`. The usage is similar as `\eqalign` but the
third column (if used) is intended to the equation mark. Example:
\begtt
$$ \eqalignno{
x + 2y + 3z &= 600 & \rm(A) \cr
12x + y - 3z &= 7 & \rm(B) \cr
4x - y + 5z &= -5 & \rm(C) \cr
} $$
\endtt
\vskip-\baselineskip
$$ \eqalignno{
x + 2y + 3z &= 600 & \rm(A) \cr
12x + y - 3z &= 7 & \rm(B) \cr
4x - y + 5z &= -5 & \rm(C) \cr
} $$
The `\leqalignno` macro is similar as `\eqalignno` but the marks are at the left
margin. The \OpTeX/ extensions of `\eqalign` are not available in
`\eqalignno` nor `\leqalignno` macros.
\new \OpTeX/
You can use auto-generated marks by `\eqmark` macro:
`$$\eqalign{<data>}\eqmark$$` or:
\begtt
$$ \eqalignno{
x + 2y + 3z &= 600 & \eqmark[A] \cr
12x + y - 3z &= 7 & \eqmark[B] \cr
4x - y + 5z &= -5 & \eqmark[C] \cr
} $$
\endtt
\sec Concept of loading math fonts
\secc[fams] Math families
\TeX/ is able to use more than one math font in math mode. This was a
necessity in old days when only 128-characters fonts existed.
Each math font used in math mode has its {\em math family} represented by a number.
Math family is a collection of three (almost) equal fonts in three sizes:
first for `\textstyle` and `\displaystyle`, second for `\scriptstyle`
and third for `\scriptscriptstyle`.
\new Unicode
When Unicode math font is loaded then it includes all three optical sizes and
all characters needed for typeseting math formula.
Theoretically, we can use only one math family with this single font. But more math families
(i.e.\ more fonts in math mode) is still possible. You can combine
characters from more fonts (Unicode fonts and old TFM fonts together) in one math formula.
\new \OpTeX/
\OpTeX/ loads the specified Unicode math font into math family 1. The math
families 2 and 3 are reserved for specific \TeX/nical reasons, family 4 is
used for `\script` font and families 5, 6, 7, etc. can be used by user for
loading more fonts. The default macro for loading math fonts looks like:
\begtt \typosize[10/12]
\_def\_normalunimath{%
\_loadumathfamily 1 {\_unimathfont}{} % Base Unicode math font
\_loadmathfamily 4 rsfs % \script (old TFM font)
\_setunimathdimens % set dimen parameters used in math formulas internally
}%
\let\_normalmath=\_normalunimath % this is done when Unicode math is initialized
\endtt
%
Whenever \OpTeX/ needs to resize math fonts (for example in footnotes or
titles), it calls the `\_normalmath` macro in order to reload all math
families to desired size. If you want to add a next font, you can add
`\_loadunimathfamily <family> {<Unicode-font>}{<features>}` or
`\_loadmathfamily <family> <TFM-font>` into the `\_normalmath` macro.
The example in section~\ref[newfam] shows how to do it.
\secc Two variants of math fonts: normal and bold
All math formulas in the whole document need only one Unicode font (or only one collection
of math fonts as mentioned in section~\ref[fams]). But this
is not really true if titles are in bold font. If a math formula is present in
such a bold title then all characters of this formula must be bolder.
For example \"normal" variables must be in bold italic in titles, symbols
like `+` `=` must be bold and \"normal bold" letters
(e.g., indicating vectors in math formula) must be extra bold in titles.
It means that all fonts from collection of math fonts must be bolder.
We need second collection of math fonts with bolder
shape. Unfortunately, it is not always available.
\new \OpTeX/
If you have bold variant of used Unicode math font, then you can use
`\loadboldmath` command, for example:
\begtt
\loadmath {[xitsmath-regular]}
\loadboldmath {[xitsmath-bold]} \to {[xitsmath-regular]}
\endtt
%
\OpTeX/ uses `\_normalmath` macro for loading collection of math fonts in
\"normal" cases and `\_boldmath` macro for bold titles. The font declared by
`\loadboldmath` is used in second case. But if the bold variant of the font is
not available (this is unfortunately more typical), then \OpTeX/ uses faked
bold of basic Unicode math font (the `embolden` internal font feature is
used). So, the default `\_boldmath` macro defined by \OpTeX/ looks like:
\begtt \typosize[10/12]
\_def\_boldunimath{%
\_ifx\_unimathboldfont \_undefined
\_loadumathfamily 1 {\_unimathfont}{embolden=1.7;} % Base faked bold
\_else
\_loadumathfamily 1 {\_unimathboldfont}{} % Base real bold font
\_fi
\_loadmathfamily 4 rsfs % rsfs in not in bold, unfortunately
\_setunimathdimens
}%
\let\_boldmath=\_boldunimath % this is done when Unicode math is initialized
\endtt
\secc[newfam] Example of using additional math font
The font `bbold10.tfm` includes double stroked characters, for example
double stroked plus, double stroked Greek letters and digits.
Try to run `pdftex testfont`, then answer to the question about name of the
font: `bbold10` and then type command `\table\end`. The `testfont.pdf` is
printed with the table of characters of this font.
Most of these characters cannot be found in Unicode math fonts.
\new \OpTeX/
We show an example how to add this font to the collection of used math fonts.
We can re-define the `\_normalmath` macro by:
\begtt \typosize[10/12]
\addto\_normalmath {\_loadmathfamily 5 bbold }
\_regtfm bbold 0 bbold5 5.5 bbold6 6.5 bbold7 7.5 bbold8 8.5 bbold9
9.5 bbold10 11.1 bbold12 15 bbold17 * % using all bbold*.tfm
\_normalmath % reload the math fonts collection
\endtt
%
The string \"`bbold`" is declared by `\_regtfm` as a collection of all
`bbold*.tfm` fonts, the optical sizes are supported.
\addto\_normalmath {\_loadmathfamily 5 bbold }
\_regtfm bbold 0 bbold5 5.5 bbold6 6.5 bbold7 7.5 bbold8 8.5 bbold9
9.5 bbold10 11.1 bbold12 15 bbold17 * % using all bbold*.tfm
\_normalmath
\Umathchardef \bbplus 2 5 "2B
\Umathchardef \bble 3 5 "3C
\Umathchardef \bbge 3 5 "3E
Finally, we must to declare new \TeX/ sequences for accessing the characters
from the new font, for example:
\begtt \typosize[10/12]
\Umathchardef \bbplus 2 5 "2B
\Umathchardef \bble 3 5 "3C
\Umathchardef \bbge 3 5 "3E
\endtt
%
The `\Umathchardef` \TeX/ primitive declares new \TeX/ sequence used in math
typesetting. First parameter is class number (2 means Bin, 3 means Rel,
see the table in the section~\ref[class]). Second parameter is math
family number. It is 5, see the redefinition of the `\_normalmath` macro above.
Third parameter is the slot in the font. Now you can try to use these characters:
$$
`a \bbplus b \bbge c` \quad \hbox{gives} \quad a \bbplus b \bbge c.
$$
%
Maybe, you want to declare a special math selector which can be used as
`$\bball a+b>c$` in order to get $\bbchar a \bbplus b \bbge c$.
Then you can define:
\begtt \typosize[10/12]
\def\bball {\bbchar \Umathcodenum `+ \bbplus
\Umathcodenum `> \bbge
\Umathcodenum `< \bble }
\endtt
If you want to add all double stroked Greek letters into `\bball`
selector, then you can do something like this:
\begtt \typosize[10/12]
\def\setbbgreek #1 {\tmpnum=#1\xargs\setbbgreekA}
\def\setbbgreekA #1{\Umathcode \_ea`#1 0 5 \tmpnum \advance\tmpnum by1 }
\addto\bball {%
\setbbgreek "0B \alpha \beta \gamma \delta \epsilon \zeta \eta
\theta \iota \kappa \lambda \mu \nu \xi \pi \rho \sigma
\tau \upsilon \phi \chi ;
\setbbgreek "7F \omega ;
\setbbgreek "00 \Gamma \Delta \Theta \Lambda \Xi \Pi \Sigma \Upsilon
\Phi \Psi \Omega ; }
\endtt
%
The `\Umathcode <input-code> <class> <family> <font-slot>` primitive is used
here. The control sequences `\alpha`, `\beta`, `\gamma` etc. are macros which expand
to the Unicode character of appropriate (non-math) Greek letter. We set the
Umathcode to such character, for example
\code{\\Umathcode `}$\_rmgreek\alpha$` 0 5 "0B` is processed.
The bold variant of the font `bbold*.tfm` is not available, unfortunately.
We have to settle for normal version of the font in the `\_boldmath` macro:
\begtt \typosize[10/12]
\addto \_boldmath {\_loadmathfamily 5 bbold }
\endtt
\bye
|