summaryrefslogtreecommitdiff
path: root/macros/generic/xint/CHANGES.html
blob: 7055bf2e04eb088a0de729f86b6cd546a7d91f64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="pandoc" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  <meta name="author" content="xint 1.4k" />
  <title>CHANGE LOG</title>
  <style>
    html {
      line-height: 1.5;
      font-family: Georgia, serif;
      font-size: 20px;
      color: #1a1a1a;
      background-color: #fdfdfd;
    }
    body {
      margin: 0 auto;
      max-width: 36em;
      padding-left: 50px;
      padding-right: 50px;
      padding-top: 50px;
      padding-bottom: 50px;
      hyphens: auto;
      overflow-wrap: break-word;
      text-rendering: optimizeLegibility;
      font-kerning: normal;
    }
    @media (max-width: 600px) {
      body {
        font-size: 0.9em;
        padding: 1em;
      }
      h1 {
        font-size: 1.8em;
      }
    }
    @media print {
      body {
        background-color: transparent;
        color: black;
        font-size: 12pt;
      }
      p, h2, h3 {
        orphans: 3;
        widows: 3;
      }
      h2, h3, h4 {
        page-break-after: avoid;
      }
    }
    p {
      margin: 1em 0;
    }
    a {
      color: #1a1a1a;
    }
    a:visited {
      color: #1a1a1a;
    }
    img {
      max-width: 100%;
    }
    h1, h2, h3, h4, h5, h6 {
      margin-top: 1.4em;
    }
    h5, h6 {
      font-size: 1em;
      font-style: italic;
    }
    h6 {
      font-weight: normal;
    }
    ol, ul {
      padding-left: 1.7em;
      margin-top: 1em;
    }
    li > ol, li > ul {
      margin-top: 0;
    }
    blockquote {
      margin: 1em 0 1em 1.7em;
      padding-left: 1em;
      border-left: 2px solid #e6e6e6;
      color: #606060;
    }
    code {
      font-family: Menlo, Monaco, 'Lucida Console', Consolas, monospace;
      font-size: 85%;
      margin: 0;
    }
    pre {
      margin: 1em 0;
      overflow: auto;
    }
    pre code {
      padding: 0;
      overflow: visible;
      overflow-wrap: normal;
    }
    .sourceCode {
     background-color: transparent;
     overflow: visible;
    }
    hr {
      background-color: #1a1a1a;
      border: none;
      height: 1px;
      margin: 1em 0;
    }
    table {
      margin: 1em 0;
      border-collapse: collapse;
      width: 100%;
      overflow-x: auto;
      display: block;
      font-variant-numeric: lining-nums tabular-nums;
    }
    table caption {
      margin-bottom: 0.75em;
    }
    tbody {
      margin-top: 0.5em;
      border-top: 1px solid #1a1a1a;
      border-bottom: 1px solid #1a1a1a;
    }
    th {
      border-top: 1px solid #1a1a1a;
      padding: 0.25em 0.5em 0.25em 0.5em;
    }
    td {
      padding: 0.125em 0.5em 0.25em 0.5em;
    }
    header {
      margin-bottom: 4em;
      text-align: center;
    }
    #TOC li {
      list-style: none;
    }
    #TOC ul {
      padding-left: 1.3em;
    }
    #TOC > ul {
      padding-left: 0;
    }
    #TOC a:not(:hover) {
      text-decoration: none;
    }
    code{white-space: pre-wrap;}
    span.smallcaps{font-variant: small-caps;}
    span.underline{text-decoration: underline;}
    div.column{display: inline-block; vertical-align: top; width: 50%;}
    div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
    ul.task-list{list-style: none;}
        body{margin: 0; margin-left : 10%; margin-right : 15%; margin-top: 4ex; font-size: 20px; font-family: serif; max-width: 100%; padding: 0; }
        pre  {white-space: pre-wrap;}
        code {white-space: pre-wrap;}
        a:link { color: blue; }
        a:visited { color: green; }
        a:hover { text-decoration: underline; color: hotpink }
        a:active { color: brown; }
        #TOC {float: right; position: relative; top: 100px; margin-bottom: 100px; margin-left: 20px;}
    .display.math{display: block; text-align: center; margin: 0.5rem auto;}
  </style>
  <!--[if lt IE 9]>
    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
  <![endif]-->
</head>
<body>
<header id="title-block-header">
<h1 class="title">CHANGE LOG</h1>
<p class="author">xint 1.4k</p>
<p class="date">2022/05/18</p>
</header>
<nav id="TOC" role="doc-toc">
<ul>
<li><a href="#k-20220518"
id="toc-k-20220518"><code>1.4k (2022/05/18)</code></a>
<ul>
<li><a href="#breaking-changes" id="toc-breaking-changes">Breaking
changes</a></li>
<li><a href="#bug-fixes" id="toc-bug-fixes">Bug fixes</a></li>
<li><a href="#new-features" id="toc-new-features">New features</a></li>
</ul></li>
<li><a href="#j-20210713"
id="toc-j-20210713"><code>1.4j (2021/07/13)</code></a>
<ul>
<li><a href="#bug-fixes-1" id="toc-bug-fixes-1">Bug fixes</a></li>
</ul></li>
<li><a href="#i-20210611"
id="toc-i-20210611"><code>1.4i (2021/06/11)</code></a>
<ul>
<li><a href="#new-features-1" id="toc-new-features-1">New
features</a></li>
<li><a href="#bug-fixes-2" id="toc-bug-fixes-2">Bug fixes</a></li>
</ul></li>
<li><a href="#h-20210527"
id="toc-h-20210527"><code>1.4h (2021/05/27)</code></a>
<ul>
<li><a href="#bug-fixes-3" id="toc-bug-fixes-3">Bug fixes</a></li>
</ul></li>
<li><a href="#g-20210525"
id="toc-g-20210525"><code>1.4g (2021/05/25)</code></a>
<ul>
<li><a href="#breaking-changes-1" id="toc-breaking-changes-1">Breaking
changes</a></li>
<li><a href="#deprecated" id="toc-deprecated">Deprecated</a></li>
<li><a href="#new-features-2" id="toc-new-features-2">New
features</a></li>
<li><a href="#bug-fixes-4" id="toc-bug-fixes-4">Bug fixes</a></li>
</ul></li>
<li><a href="#f-20210510"
id="toc-f-20210510"><code>1.4f (2021/05/10)</code></a>
<ul>
<li><a href="#breaking-changes-2" id="toc-breaking-changes-2">Breaking
changes</a></li>
<li><a href="#bug-fixes-5" id="toc-bug-fixes-5">Bug fixes</a></li>
</ul></li>
<li><a href="#e-20210505"
id="toc-e-20210505"><code>1.4e (2021/05/05)</code></a>
<ul>
<li><a href="#breaking-changes-3" id="toc-breaking-changes-3">Breaking
changes</a></li>
<li><a href="#new-features-3" id="toc-new-features-3">New
features</a></li>
<li><a href="#bug-fixes-6" id="toc-bug-fixes-6">Bug fixes</a></li>
</ul></li>
<li><a href="#d-20210329"
id="toc-d-20210329"><code>1.4d (2021/03/29)</code></a>
<ul>
<li><a href="#breaking-changes-4" id="toc-breaking-changes-4">Breaking
changes</a></li>
<li><a href="#bug-fixes-7" id="toc-bug-fixes-7">Bug fixes</a></li>
</ul></li>
<li><a href="#c-20210220"
id="toc-c-20210220"><code>1.4c (2021/02/20)</code></a>
<ul>
<li><a href="#bug-fixes-8" id="toc-bug-fixes-8">Bug fixes</a></li>
</ul></li>
<li><a href="#b-20200225"
id="toc-b-20200225"><code>1.4b (2020/02/25)</code></a>
<ul>
<li><a href="#future" id="toc-future">Future</a></li>
<li><a href="#new-features-4" id="toc-new-features-4">New
features</a></li>
<li><a href="#bug-fixes-9" id="toc-bug-fixes-9">Bug fixes</a></li>
</ul></li>
<li><a href="#a-20200219"
id="toc-a-20200219"><code>1.4a (2020/02/19)</code></a>
<ul>
<li><a href="#breaking-changes-5" id="toc-breaking-changes-5">Breaking
changes</a></li>
<li><a href="#new-features-5" id="toc-new-features-5">New
features</a></li>
<li><a href="#bug-fixes-10" id="toc-bug-fixes-10">Bug fixes</a></li>
</ul></li>
<li><a href="#section"
id="toc-section"><code>1.4 (2020/01/31)</code></a>
<ul>
<li><a href="#breaking-changes-6" id="toc-breaking-changes-6">Breaking
changes</a></li>
<li><a href="#improvements-and-new-features"
id="toc-improvements-and-new-features">Improvements and new
features</a></li>
<li><a href="#bug-fixes-11" id="toc-bug-fixes-11">Bug fixes</a></li>
<li><a href="#todo" id="toc-todo">TODO</a></li>
</ul></li>
<li><a href="#f-20190910"
id="toc-f-20190910"><code>1.3f (2019/09/10)</code></a>
<ul>
<li><a href="#improvements-and-new-features-1"
id="toc-improvements-and-new-features-1">Improvements and new
features</a></li>
<li><a href="#bug-fixes-12" id="toc-bug-fixes-12">Bug fixes</a></li>
</ul></li>
<li><a href="#e-20190405"
id="toc-e-20190405"><code>1.3e (2019/04/05)</code></a>
<ul>
<li><a href="#breaking-changes-7" id="toc-breaking-changes-7">Breaking
changes</a></li>
<li><a href="#improvements-and-new-features-2"
id="toc-improvements-and-new-features-2">Improvements and new
features</a></li>
<li><a href="#bug-fixes-13" id="toc-bug-fixes-13">Bug fixes</a></li>
</ul></li>
<li><a href="#d-20190106"
id="toc-d-20190106"><code>1.3d (2019/01/06)</code></a>
<ul>
<li><a href="#breaking-changes-8" id="toc-breaking-changes-8">Breaking
changes</a></li>
<li><a href="#improvements-and-new-features-3"
id="toc-improvements-and-new-features-3">Improvements and new
features</a></li>
<li><a href="#bug-fixes-14" id="toc-bug-fixes-14">Bug fixes</a></li>
</ul></li>
<li><a href="#c-20180617"
id="toc-c-20180617"><code>1.3c (2018/06/17)</code></a>
<ul>
<li><a href="#improvements-and-new-features-4"
id="toc-improvements-and-new-features-4">Improvements and new
features</a></li>
<li><a href="#bug-fixes-15" id="toc-bug-fixes-15">Bug fixes</a></li>
</ul></li>
<li><a href="#b-20180518"
id="toc-b-20180518"><code>1.3b (2018/05/18)</code></a>
<ul>
<li><a href="#improvements-and-new-features-5"
id="toc-improvements-and-new-features-5">Improvements and new
features</a></li>
</ul></li>
<li><a href="#a-20180307"
id="toc-a-20180307"><code>1.3a (2018/03/07)</code></a>
<ul>
<li><a href="#removed" id="toc-removed">Removed</a></li>
<li><a href="#improvements-and-new-features-6"
id="toc-improvements-and-new-features-6">Improvements and new
features</a></li>
<li><a href="#bug-fixes-16" id="toc-bug-fixes-16">Bug fixes</a></li>
</ul></li>
<li><a href="#section-1"
id="toc-section-1"><code>1.3 (2018/03/01)</code></a>
<ul>
<li><a href="#breaking-changes-9" id="toc-breaking-changes-9">Breaking
changes</a></li>
<li><a href="#improvements-and-new-features-7"
id="toc-improvements-and-new-features-7">Improvements and new
features</a></li>
</ul></li>
<li><a href="#q-20180206"
id="toc-q-20180206"><code>1.2q (2018/02/06)</code></a>
<ul>
<li><a href="#improvements-and-new-features-8"
id="toc-improvements-and-new-features-8">Improvements and new
features</a></li>
<li><a href="#bug-fixes-17" id="toc-bug-fixes-17">Bug fixes</a></li>
</ul></li>
<li><a href="#p-20171205"
id="toc-p-20171205"><code>1.2p (2017/12/05)</code></a>
<ul>
<li><a href="#breaking-changes-10" id="toc-breaking-changes-10">Breaking
changes</a></li>
<li><a href="#improvements-and-new-features-9"
id="toc-improvements-and-new-features-9">Improvements and new
features</a></li>
<li><a href="#bug-fixes-18" id="toc-bug-fixes-18">Bug fixes</a></li>
</ul></li>
<li><a href="#o-20170829"
id="toc-o-20170829"><code>1.2o (2017/08/29)</code></a>
<ul>
<li><a href="#breaking-changes-11" id="toc-breaking-changes-11">Breaking
changes</a></li>
<li><a href="#deprecated-1" id="toc-deprecated-1">Deprecated</a></li>
</ul></li>
<li><a href="#n-20170806"
id="toc-n-20170806"><code>1.2n (2017/08/06)</code></a>
<ul>
<li><a href="#breaking-changes-12" id="toc-breaking-changes-12">Breaking
changes</a></li>
<li><a href="#improvements-and-new-features-10"
id="toc-improvements-and-new-features-10">Improvements and new
features</a></li>
</ul></li>
<li><a href="#m-20170731"
id="toc-m-20170731"><code>1.2m (2017/07/31)</code></a>
<ul>
<li><a href="#breaking-changes-13" id="toc-breaking-changes-13">Breaking
changes</a></li>
<li><a href="#improvements-and-new-features-11"
id="toc-improvements-and-new-features-11">Improvements and new
features</a></li>
<li><a href="#bug-fixes-19" id="toc-bug-fixes-19">Bug fixes</a></li>
</ul></li>
<li><a href="#l-20170726"
id="toc-l-20170726"><code>1.2l (2017/07/26)</code></a>
<ul>
<li><a href="#removed-1" id="toc-removed-1">Removed</a></li>
<li><a href="#improvements-and-new-features-12"
id="toc-improvements-and-new-features-12">Improvements and new
features</a></li>
<li><a href="#bug-fixes-20" id="toc-bug-fixes-20">Bug fixes</a></li>
</ul></li>
<li><a href="#k-20170106"
id="toc-k-20170106"><code>1.2k (2017/01/06)</code></a>
<ul>
<li><a href="#breaking-changes-14" id="toc-breaking-changes-14">Breaking
changes</a></li>
<li><a href="#improvements-and-new-features-13"
id="toc-improvements-and-new-features-13">Improvements and new
features</a></li>
<li><a href="#bug-fixes-21" id="toc-bug-fixes-21">Bug fixes</a></li>
</ul></li>
<li><a href="#j-20161222"
id="toc-j-20161222"><code>1.2j (2016/12/22)</code></a>
<ul>
<li><a href="#improvements-and-new-features-14"
id="toc-improvements-and-new-features-14">Improvements and new
features</a></li>
<li><a href="#bug-fixes-22" id="toc-bug-fixes-22">Bug fixes</a></li>
</ul></li>
<li><a href="#i-20161213"
id="toc-i-20161213"><code>1.2i (2016/12/13)</code></a>
<ul>
<li><a href="#breaking-changes-15" id="toc-breaking-changes-15">Breaking
changes</a></li>
<li><a href="#removed-2" id="toc-removed-2">Removed</a></li>
<li><a href="#improvements-and-new-features-15"
id="toc-improvements-and-new-features-15">Improvements and new
features</a></li>
<li><a href="#bug-fixes-23" id="toc-bug-fixes-23">Bug fixes</a></li>
</ul></li>
<li><a href="#h-20161120"
id="toc-h-20161120"><code>1.2h (2016/11/20)</code></a>
<ul>
<li><a href="#improvements-and-new-features-16"
id="toc-improvements-and-new-features-16">Improvements and new
features</a></li>
<li><a href="#bug-fixes-24" id="toc-bug-fixes-24">Bug fixes</a></li>
</ul></li>
<li><a href="#g-20160319"
id="toc-g-20160319"><code>1.2g (2016/03/19)</code></a>
<ul>
<li><a href="#breaking-changes-16" id="toc-breaking-changes-16">Breaking
changes</a></li>
<li><a href="#improvements-and-new-features-17"
id="toc-improvements-and-new-features-17">Improvements and new
features</a></li>
</ul></li>
<li><a href="#f-20160312"
id="toc-f-20160312"><code>1.2f (2016/03/12)</code></a>
<ul>
<li><a href="#breaking-changes-17" id="toc-breaking-changes-17">Breaking
changes</a></li>
<li><a href="#improvements-and-new-features-18"
id="toc-improvements-and-new-features-18">Improvements and new
features</a></li>
<li><a href="#bug-fixes-25" id="toc-bug-fixes-25">Bug fixes</a></li>
</ul></li>
<li><a href="#e-20151122"
id="toc-e-20151122"><code>1.2e (2015/11/22)</code></a>
<ul>
<li><a href="#improvements-and-new-features-19"
id="toc-improvements-and-new-features-19">Improvements and new
features</a></li>
<li><a href="#bug-fixes-26" id="toc-bug-fixes-26">Bug fixes</a></li>
</ul></li>
<li><a href="#d-20151118"
id="toc-d-20151118"><code>1.2d (2015/11/18)</code></a>
<ul>
<li><a href="#improvements-and-new-features-20"
id="toc-improvements-and-new-features-20">Improvements and new
features</a></li>
<li><a href="#bug-fixes-27" id="toc-bug-fixes-27">Bug fixes</a></li>
</ul></li>
<li><a href="#c-20151116"
id="toc-c-20151116"><code>1.2c (2015/11/16)</code></a>
<ul>
<li><a href="#improvements-and-new-features-21"
id="toc-improvements-and-new-features-21">Improvements and new
features</a></li>
<li><a href="#bug-fixes-28" id="toc-bug-fixes-28">Bug fixes</a></li>
</ul></li>
<li><a href="#b-20151029"
id="toc-b-20151029"><code>1.2b (2015/10/29)</code></a>
<ul>
<li><a href="#bug-fixes-29" id="toc-bug-fixes-29">Bug fixes</a></li>
</ul></li>
<li><a href="#a-20151019"
id="toc-a-20151019"><code>1.2a (2015/10/19)</code></a>
<ul>
<li><a href="#improvements-and-new-features-22"
id="toc-improvements-and-new-features-22">Improvements and new
features</a></li>
<li><a href="#bug-fixes-30" id="toc-bug-fixes-30">Bug fixes</a></li>
</ul></li>
<li><a href="#section-2"
id="toc-section-2"><code>1.2 (2015/10/10)</code></a>
<ul>
<li><a href="#removed-3" id="toc-removed-3">Removed</a></li>
<li><a href="#improvements-and-new-features-23"
id="toc-improvements-and-new-features-23">Improvements and new
features</a></li>
</ul></li>
<li><a href="#c-20150912"
id="toc-c-20150912"><code>1.1c (2015/09/12)</code></a></li>
<li><a href="#b-20150831"
id="toc-b-20150831"><code>1.1b (2015/08/31)</code></a></li>
<li><a href="#a-20141107"
id="toc-a-20141107"><code>1.1a (2014/11/07)</code></a></li>
<li><a href="#section-3"
id="toc-section-3"><code>1.1 (2014/10/28)</code></a>
<ul>
<li><a href="#breaking-changes-18" id="toc-breaking-changes-18">Breaking
changes</a></li>
<li><a href="#removed-4" id="toc-removed-4">Removed</a></li>
<li><a href="#deprecated-2" id="toc-deprecated-2">Deprecated</a></li>
<li><a href="#improvements-and-new-features-24"
id="toc-improvements-and-new-features-24">Improvements and new
features</a></li>
<li><a href="#bug-fixes-31" id="toc-bug-fixes-31">Bug fixes</a></li>
</ul></li>
<li><a href="#n-20140401"
id="toc-n-20140401"><code>1.09n (2014/04/01)</code></a></li>
<li><a href="#m-20140226"
id="toc-m-20140226"><code>1.09m (2014/02/26)</code></a></li>
<li><a href="#kb-20140213"
id="toc-kb-20140213"><code>1.09kb (2014/02/13)</code></a></li>
<li><a href="#k-20140121"
id="toc-k-20140121"><code>1.09k (2014/01/21)</code></a></li>
<li><a href="#j-20140109"
id="toc-j-20140109"><code>1.09j (2014/01/09)</code></a></li>
<li><a href="#i-20131218"
id="toc-i-20131218"><code>1.09i (2013/12/18)</code></a></li>
<li><a href="#h-20131128"
id="toc-h-20131128"><code>1.09h (2013/11/28)</code></a></li>
<li><a href="#g-20131122"
id="toc-g-20131122"><code>1.09g (2013/11/22)</code></a></li>
<li><a href="#f-20131104"
id="toc-f-20131104"><code>1.09f (2013/11/04)</code></a></li>
<li><a href="#e-20131029"
id="toc-e-20131029"><code>1.09e (2013/10/29)</code></a></li>
<li><a href="#d-20131022"
id="toc-d-20131022"><code>1.09d (2013/10/22)</code></a></li>
<li><a href="#c-20131009"
id="toc-c-20131009"><code>1.09c (2013/10/09)</code></a></li>
<li><a href="#b-20131003"
id="toc-b-20131003"><code>1.09b (2013/10/03)</code></a></li>
<li><a href="#a-20130924"
id="toc-a-20130924"><code>1.09a (2013/09/24)</code></a></li>
<li><a href="#b-20130614"
id="toc-b-20130614"><code>1.08b (2013/06/14)</code></a></li>
<li><a href="#a-20130611"
id="toc-a-20130611"><code>1.08a (2013/06/11)</code></a></li>
<li><a href="#section-4"
id="toc-section-4"><code>1.08 (2013/06/07)</code></a></li>
<li><a href="#section-5"
id="toc-section-5"><code>1.07 (2013/05/25)</code></a></li>
<li><a href="#b-20130514"
id="toc-b-20130514"><code>1.06b (2013/05/14)</code></a></li>
<li><a href="#section-6"
id="toc-section-6"><code>1.06 (2013/05/07)</code></a></li>
<li><a href="#section-7"
id="toc-section-7"><code>1.05 (2013/05/01)</code></a></li>
<li><a href="#section-8"
id="toc-section-8"><code>1.04 (2013/04/25)</code></a></li>
<li><a href="#section-9"
id="toc-section-9"><code>1.03 (2013/04/14)</code></a></li>
<li><a href="#section-10"
id="toc-section-10"><code>1.0 (2013/03/28)</code></a></li>
</ul>
</nav>
<pre><code>Source:  xint.dtx 1.4k 2022/05/18 (doc 2022/05/18)
Author:  Jean-Francois Burnol
Info:    Expandable operations on big integers, decimals, fractions
License: LPPL 1.3c</code></pre>
<h2 id="k-20220518"><code>1.4k (2022/05/18)</code></h2>
<h3 id="breaking-changes">Breaking changes</h3>
<ul>
<li><p><strong>xintfrac</strong>: the longstanding (but documented as
undecided and unstable) way of <code>\xintFloat</code> to output the
zero value was <code>0.e0</code> and it has now been modified into
<code>0.0e0</code>. Customizable via
<code>\xintFloatZero</code>.</p></li>
<li><p><strong>xintfrac</strong>/<strong>xintexpr</strong>: the
behaviour of <code>\xintPFloat</code> (hence of
<code>\xintfloateval</code>) has again changed: when the output is an
integer (not using scientific notation) it does not get postfixed by
<code>.0</code>. This applies in particular for the zero value, now
printed <code>0</code>. Similarly, in the case of scientific notation
with a single-digit (trimmed) mantissa, no <code>.0</code> is used.</p>
<p>Customizable via <code>\xintPFloatIntSuffix</code>,
<code>\xintPFloatLengthOneSuffix</code>, and
<code>\xintPFloatZero</code>.</p>
<p>Also, <code>\xintPFloat</code> trims trailing zeros from the full
significand only if there are at least <code>4</code> of them, see
<code>\xintPFloatMinTrimmed</code>.</p></li>
<li><p><strong>xintfrac</strong>/<strong>xintexpr</strong>: definition
of <code>\xintFracToSci</code> migrated from the former to the
latter.</p></li>
<li><p><strong>xintexpr</strong>:
<code>\xintexpr{Safe,Restore}Catcodes</code> pairs now behave like a
“last in first out” stack. Check the <code>pdf</code> documentation for
details.</p></li>
</ul>
<h3 id="bug-fixes">Bug fixes</h3>
<ul>
<li><p><strong>xintexpr</strong>: the
<code>\xintexpr{Safe,Restore}Catcodes</code> were documented at user
level, but also used by the package <code>\xintdefvar</code> or
<code>\xintdeffunc</code>. This could result in some bad interaction due
to the somewhat strange (but documented) behaviour of nested
<code>\xintexpr{Safe,Restore}Catcodes</code> (which has now been
modified).</p></li>
<li><p><strong>xintexpr</strong>: ever since <code>1.4</code>,
<code>\xintdefufunc</code> (but not <code>\xintdeffunc</code>) forgot to
reset the catcodes to their status prior to the sanitization done by the
macro at the start of its execution.</p></li>
</ul>
<h3 id="new-features">New features</h3>
<ul>
<li><p><strong>xintfrac</strong>: <code>\xintPFloatZero</code>,
<code>\xintPFloatIntSuffix</code>,
<code>\xintPFloatLengthOneSuffix</code>,
<code>\xintPFloatNoSciEmax</code>, <code>\xintPFloatNoSciEmin</code> and
<code>\xintPFloatMinTrimmed</code> customize the output of
<code>\xintPFloat</code>, hence also of <code>\xintfloateval</code> (and
of <code>\xinteval</code> when scientific notation was used in the
expression). Also added <code>\xintFloatZero</code>.</p></li>
<li><p><strong>xintfrac</strong>:
<code>\xintFloatToDecimal</code>.</p></li>
<li><p><strong>xintexpr</strong>: <code>\xintFracToDecimal</code>, an
alternative to <code>\xintFracToSci</code> for the configuration of
<code>\xintexprPrintOne</code>.</p></li>
<li><p><strong>xintexpr</strong>: long awaited syntax
<code>\xintieval[D]{...}</code> and <code>\xintfloateval[Q]{...}</code>
now implemented. The legacy syntax with <code>\xintieval{[D]...}</code>
and <code>\xintfloateval{[Q]...}</code> is kept for backwards
compatibility.</p></li>
</ul>
<h2 id="j-20210713"><code>1.4j (2021/07/13)</code></h2>
<h3 id="bug-fixes-1">Bug fixes</h3>
<ul>
<li><strong>xinttools</strong>: a brace removal bug affected the
venerable <code>\xintSeq</code> if producing a single number
(e.g. <code>\xintSeq{10}{10}</code> expanded to <code>10</code> not
<code>{10}</code>). Thanks to Christophe Poulain for report.</li>
</ul>
<h2 id="i-20210611"><code>1.4i (2021/06/11)</code></h2>
<h3 id="new-features-1">New features</h3>
<ul>
<li><p><strong>xintexpr</strong>: the concept of simultaneous
assignments is extended: in case of more variables than values the
extraneous variables do not cause an error message but are simply set to
the <code>nil</code> value; in case of more values than variables, the
last variable is defined to be the ople concatenating all the extra
values.</p></li>
<li><p><strong>xintexpr</strong>: built-in functions usable with
arbitrarily many arguments such as <code>max()</code>,
<code>gcd()</code>, or <code>len()</code> are now again usable with a
single numeric argument: since <code>1.4</code> a lone argument had to
be a <code>nutple</code> (which was automatically unpacked). It can now
again be a number.</p></li>
</ul>
<h3 id="bug-fixes-2">Bug fixes</h3>
<ul>
<li><p><strong>xintexpr</strong>: simultaneous assignments via
<code>\xintdefvar</code> to 10 or more variables was broken if the right
hand side was an ople (of length at least 10, as it had prior to this
release to match the number of variables).</p></li>
<li><p><strong>xintexpr</strong>: the mechanism which allows to define
variables with names already in use for pre-existing functions was
broken for some built-in functions: those handling syntax with dummy
variables (currently <code>subs()</code>, <code>subsm()</code>,
<code>subsn()</code>, <code>seq()</code>, <code>add()</code>,
<code>mul()</code>, <code>ndseq()</code>, <code>ndmap()</code>,
<code>ndfillraw()</code>) and the so-called “pseudo” functions
(currently <code>bool()</code>, <code>togl()</code>,
<code>protect()</code>, <code>qint()</code>, <code>qfrac()</code>,
<code>qfloat()</code>, <code>qraw()</code>, <code>random()</code>,
<code>qrand()</code>, <code>rbit()</code>). For example the function
<code>seq()</code> was broken if the user had defined a variable
<code>seq</code>.</p></li>
</ul>
<h2 id="h-20210527"><code>1.4h (2021/05/27)</code></h2>
<h3 id="bug-fixes-3">Bug fixes</h3>
<ul>
<li><p><strong>xintexpr</strong>: the recent <code>1.4g</code>
introduced a bug breaking input of the type
<code>&lt;operator&gt;&lt;space token&gt;&lt;macro&gt;</code>.</p></li>
<li><p><strong>xintexpr</strong>: since <code>1.4</code>
(<code>2020/01/31</code>) the <code>omit</code> and <code>abort</code>
keywords were broken if used inside a substitution, itself nested in a
<code>seq()</code> or similar construct.</p></li>
<li><p><strong>xintexpr</strong>: since <code>1.4c</code> the
<code>\xintthespaceseparated</code> (added at <code>1.4a</code>)
inserted two, not one, spaces at one specific location near the end of
its output. A bit cosmetic problem, fixed nevertheless.</p></li>
</ul>
<h2 id="g-20210525"><code>1.4g (2021/05/25)</code></h2>
<h3 id="breaking-changes-1">Breaking changes</h3>
<ul>
<li><p><strong>xintexpr</strong>: the parsing of power operators
<code>**</code> and <code>^</code> now proceeds in a right associative
way: <code>2^3^4==2^(3^4)</code>.</p></li>
<li><p><strong>xintexpr</strong>: single-character operators
<code>&amp;</code>, <code>|</code>, and <code>=</code> (deprecated since
<code>1.1</code>) have been removed. Use <code>&amp;&amp;</code>,
<code>||</code> and <code>==</code> respectively.</p></li>
</ul>
<h3 id="deprecated">Deprecated</h3>
<ul>
<li><strong>xintfrac</strong>: old typesetting macros dating back to
<code>1.03</code> and <code>1.04</code> releases <code>\xintFrac</code>,
<code>\xintSignedFrac</code>, <code>\xintFwOver</code>,
<code>\xintSignedFwOver</code> are deprecated. Please use the new names
<code>\xintTeXFrac</code>, <code>\xintTeXsignedFrac</code>,
<code>\xintTeXOver</code>, <code>\xintTeXsignedOver</code>. The old
names will emit warnings.</li>
</ul>
<h3 id="new-features-2">New features</h3>
<ul>
<li><p>Messages written to the terminal and log file during the handling
of recovery from exceptions use a new mechanism; when in interactive
mode, the user is prompted only once, not thrice, to enter
<code>&lt;return&gt;</code> for recovery and continued
processing.</p></li>
<li><p><strong>xintfrac</strong>: <code>\xintTeXfromSci</code> (added
about 7 or 8 years too late) to help typesetting values output by
<code>\xintfloateval</code> in a more useful way than
<code>\xintTeXFrac</code> (formerly <code>\xintFrac</code>).</p></li>
</ul>
<h3 id="bug-fixes-4">Bug fixes</h3>
<ul>
<li><p><strong>xintexpr</strong>: with <strong>xintbinhex</strong>
loaded, <code>"</code> is recognized as prefix for hexadecimal input;
but a bug (present ever since this support for hexadecimal input was
added) caused syntax such as <code>"\macro</code> to break the parser.
Also, leading zeros such as in <code>"0000A</code> where not properly
trimmed since <code>1.2m</code>.</p></li>
<li><p><strong>xintexpr</strong>: authorize <code>x! == y</code> without
parentheses. Formerly the parser mis-interpreted <code>!</code> as first
character of the <code>!=</code> not-equal-to comparison operator,
subsequently causing breakage when finding the second
<code>=</code>.</p></li>
<li><p><strong>xintexpr</strong>: various error situations were badly
handled.</p>
<ul>
<li><code>\xinteval{1/0}</code> did not recover gracefully due to
longstanding bug in <strong>xintfrac</strong>.</li>
<li><code>\xintfloateval{1/0}</code> did not recover gracefully either…
due to some other reason.</li>
<li>recovery from encountering an unknown variable name was broken since
<code>1.4</code>; also, with an unknown function name if in
<code>\xintfloatexpr</code>.</li>
<li><code>\xinteval{_4}</code> caused an infinite loop (with underscore
<code>_</code> having its normal catcode). This was unexpected, as the
<code>_</code> is documented to be ignored if in-between digits (and is
ignored if last after some digits). It will be now ignored also if
encountered upfront. A similar problem existed with variable names
starting with a <code>_</code> (of normal catcode), which however are
clearly not legal. The (normal catcode) <code>_</code> will then be
ignored as well if encountered in front of a variable or function name
(but not inside of course).</li>
<li><code>\xinteval{\catcode`@}</code> crashed (one had to use an added
<code>\the</code> or <code>\number</code>).</li>
<li>illegal <code>\xinteval{/3}</code> was not intercepted and
ultimately caused low-level errors (same with <code>^</code>).</li>
</ul>
<p>Surely, further situations remain where bad input will crash
parser.</p></li>
</ul>
<h2 id="f-20210510"><code>1.4f (2021/05/10)</code></h2>
<h3 id="breaking-changes-2">Breaking changes</h3>
<ul>
<li><p><strong>xintexpr</strong>: <code>\xintieval{[-D]...}</code>,
which rounds to a multiple of <code>1eD</code> for <code>D</code>
positive now <em>does not insert the trailing zeros</em> (as done at
<code>1.4e</code>) <em>nor a scientific part</em> <code>eD</code> (as
prior to <code>1.4e</code>). The use case envisioned is for the
quantized value to be used with an appropriate unit, for example
<code>k</code> for <code>D=3</code> or <code>M</code> for
<code>D=6</code> etc… Sorry for the very long process which was needed
to reach this final decision.</p></li>
<li><p><strong>xintexpr</strong>: for Digits beyond the officially
supported range for accurate math functions, i.e. for
<code>D&gt;62</code>, computations were still done and printed with full
number of digits, but the extra digits were meaningless; they now
operate on and output mantissas limited to <code>min(D,64)</code>
digits.</p></li>
<li><p><strong>xintexpr</strong>: for powers <code>a^b</code> with
Digits at most <code>8</code>, the number <code>a</code> is now
float-rounded to Digits before computation, as is done for
<code>Digits&gt;8</code>; previously <code>9</code> significant digits
were kept.</p></li>
<li><p><strong>xintexpr</strong>: further changes in the computation of
powers, see the bug fixes below.</p></li>
<li><p><strong>xintexpr</strong>: the <code>float_()</code> function got
renamed into <code>float_dgt()</code>.</p></li>
</ul>
<h3 id="bug-fixes-5">Bug fixes</h3>
<ul>
<li><p><strong>xintexpr</strong>: the documentation said
<code>float_()</code> function had been renamed <code>float_dgt()</code>
but actually that was not yet the case.</p></li>
<li><p><strong>xintexpr</strong>: powers <code>a^b</code> (with exponent
<code>b</code> neither integer nor half-integer) stopped being accurate
regarding the last digits for <code>|b|</code> about <code>1000</code>
and beyond. Except for <code>0.8&lt;a&lt;1.25</code> for which accuracy
was maintained up to about <code>|b|=10^7</code>. Fixed via keeping the
same suitable number of extra digits for internal computations of
logarithms, independently of whether <code>a</code> is close to
<code>1</code> or not.</p></li>
<li><p><strong>xintexpr</strong>: powers <code>a^b</code> in
<code>\xinteval</code> with <code>|b|</code> an integer at least
<code>10000</code> were paradoxically computed with less accuracy than
in <code>\xintfloateval</code>… although they were documented to be
handled exactly the same in the two parsers.</p></li>
<li><p><strong>xintexpr</strong>: powers <code>a^b</code> for Digits at
most <code>8</code> unconditionally used <code>log10()/pow10()</code>
approach but due to the limited accuracy of the poorman logarithm
(<code>9</code> fractional digits) this was inaccurate already for
<code>b</code> about <code>100</code>. So, the handling is now as for
Digits at least <code>9</code>, i.e. integer and half-integer exponents
are handled via the legacy <code>\xintFloatPower/\xintFloatSqrt</code>
allowing arbitrarily big exponents. It is advised to split big powers
with non integer non half integer exponents into a product; this is not
done internally to avoid costly overhead for possibly rare use
cases.</p></li>
<li><p><strong>xintexpr</strong>: the invalid input
<code>(-1)^2.5</code> triggered an undefined control sequence error if
Digits was at most <code>8</code>.</p></li>
</ul>
<h2 id="e-20210505"><code>1.4e (2021/05/05)</code></h2>
<h3 id="breaking-changes-3">Breaking changes</h3>
<ul>
<li><p><strong>xintlog</strong>: <code>\poormanloghack</code> now a
no-op.</p></li>
<li><p><strong>xinttrig</strong>: loading the package does not define
left-over variables holding the values of the inverse factorials used in
the sine and cosine series.</p></li>
<li><p><strong>xintexpr</strong>: the output format of
<code>\xinteval</code>, which uses <code>\xintFracToSci,</code> has
changed. In particular, if the number has a power of ten part, it is not
output with an integer mantissa, but with a scientific mantissa
<code>d.d...</code> with always at least one digit after the decimal
mark (possibly <code>0</code>) and trailing zeros are trimmed out. This
is the same output format as used for <code>\xintfloateval</code>, apart
of course from the fact that the mantissa lengths are not
limited.</p></li>
<li><p><strong>xintexpr</strong>: the output format of
<code>\xintfloateval</code>, which uses <code>\xintPFloat</code>,
changed. The <code>\xintfloatexprPrintOne</code> macro has changed its
signature to <code>[#1]{#2}</code> i.e. its first argument will be
within brackets not braces.</p></li>
<li><p><strong>xintexpr</strong>: when using
<code>\xintieval{[D]...}</code> optional <code>[D]</code> with a
negative <code>D</code>, which triggers quantization to a positive power
of ten, the output (if not the zero value) will be an integer with
<code>N=abs(D)</code> explicit trailing zeros, not an integer mantissa
followed by <code>eN</code>.</p></li>
<li><p><strong>xintexpr</strong>: <code>\xinteval</code> will not
compute powers <code>a^N</code> exactly if <code>N</code> in absolute
value is at least the (rounded) quotient of <code>10000</code> by the
number of digits of <code>a</code>; it will then use the
logarithm/exponential (in base 10) approach, according to the prevailing
Digits setting (at <code>1.4f</code> this got modified again and integer
exponents large enough to trigger floating point evaluation are handled
exactly as in <code>\xintfloateval</code>, i.e. using the legacy
<strong>xintfrac</strong> <code>\xintFloatPower</code>, not the
logarithm/exponential approach which loses accuracy for exponents of the
order of <code>100000000</code> and beyond).</p></li>
<li><p><strong>xintexpr</strong>: <code>\xintdeffloatvar</code> now
always rounds the assigned value to the target precision. Formerly,
inputs actually involving no float operations, such as for example a
sub-expression <code>\xintexpr1/20!\relax</code> (in contrast to
<code>1/20!</code>), or an explicit single number having more digits
than the precision, got stored “as is” in the defined variable, without
pre-rounding to the Digits precision.</p></li>
<li><p><strong>xintfrac</strong>:<code>\xintPFloat</code> and
<code>\xintFracToSci</code> have both been modified. The macro
<code>\xintFracToSciE</code> does not exist anymore, as
<code>\xintFracToSci</code> in the case of scientific exponents hands
over the process to <code>\xintPFloat</code> (without the rounding to
Digits, of course).</p></li>
</ul>
<h3 id="new-features-3">New features</h3>
<ul>
<li><p><strong>xintlog</strong>: now working up to <code>62</code>
digits. The legacy faster <code>poormanlog</code>-based macros are kept
for computations with Digits up to <code>8</code>. Fractional powers are
now available both in <code>xinteval</code> and
<code>xintfloateval</code>, per default.</p></li>
<li><p><strong>xinttrig</strong>: now working up to <code>62</code>
digits and with increased accuracy. Special faster (or not as slow if
you prefer) mode at <code>8</code> digits or less.</p></li>
<li><p><strong>xintexpr</strong>: the constraints on the
<code>\xintexprPrintOne</code> replacement macro, which defaults to
<code>\xintFracToSci</code>, have been much simplified.</p></li>
<li><p><strong>xintexpr</strong>: <code>\xintiexprPrintOne</code>
(defaults to <code>\xintDecToString</code>)</p></li>
<li><p><strong>xintfrac</strong>: <code>\xintPFloatE</code> may be
redefined as a macro which fetches the scientific exponent as a
mandatory argument delimited with a dot, and outputs a suitable
formatted result (f-expandably), also delimited with a dot which will be
removed by internal processing. The default however simply expands to
the letter <code>e</code>.</p></li>
<li><p><strong>xintfrac</strong>: <code>\xintDecToStringREZ</code> is
like <code>\xintDecToString</code> but starts by removing trailing
zeroes.</p></li>
</ul>
<h3 id="bug-fixes-6">Bug fixes</h3>
<ul>
<li><strong>xintfrac</strong>, <strong>xintexpr</strong>: it was not
possible to use <code>\xinttheDigits</code> in the right hand side of an
<code>\xintDigits</code> assignment. For example:
<code>\xintDigits*:=\numexpr\xinttheDigits+4;</code>. This is now
allowed, and the same applies to the macro interface, for example
<code>\xintSetDigits*{\xinttheDigits+4}</code>.</li>
</ul>
<h2 id="d-20210329"><code>1.4d (2021/03/29)</code></h2>
<h3 id="breaking-changes-4">Breaking changes</h3>
<ul>
<li><p><code>quo()</code> and <code>rem()</code> in
<code>\xintiiexpr/\xintiieval</code> renamed to <code>iquo()</code> and
<code>irem()</code>.</p></li>
<li><p>The output of <code>gcd()</code> and <code>lcm()</code> as
applied to fractions is now always in lowest terms.</p></li>
<li><p>The log message to report a variable creation (if
<code>\xintverbosetrue</code>) does not use (double) quotes anymore
around the name. By the way, quotes were never used for function
names.</p></li>
</ul>
<h3 id="bug-fixes-7">Bug fixes</h3>
<ul>
<li><p>Ever since <code>1.3</code> the <code>quo()</code> and
<code>rem()</code> functions in <code>\xintexpr</code> (not the ones in
<code>\xintiiexpr</code>) were broken as their (officially deprecated)
support macros had been removed! They had somewhat useless definitions
anyway. They have now been officially removed from the syntax. Their
siblings in <code>\xintiieval</code> were renamed to <code>iquo()</code>
and <code>irem()</code>.</p></li>
<li><p>Sadly, <code>gcd()</code> was broken in <code>\xintexpr</code>
since <code>1.4</code>, if the first argument vanished. And
<code>gcd()</code> was broken in <code>\xintiiexpr</code> since
<code>1.3d</code> if <em>any</em> argument vanished. I did have a unit
test! (which obviously was too limited …)</p>
<p>Further, the <code>\xintGCDof</code> and <code>\xintLCMof</code>
<strong>xintfrac</strong> macros were added at <code>1.4</code> but did
not behave like other <strong>xintfrac</strong> macros with respect to
parsing their arguments: e.g. <code>\xintGCDof{2}{03}</code> gave an
unexpected non-numeric result.</p></li>
<li><p>The <code>first()</code> and <code>last()</code> functions, if
used as arguments to numerical functions such as <code>sqr()</code>
inside an <code>\xintdeffunc</code> caused the defined function to be
broken.</p></li>
</ul>
<h2 id="c-20210220"><code>1.4c (2021/02/20)</code></h2>
<h3 id="bug-fixes-8">Bug fixes</h3>
<ul>
<li>Fix <code>1.4</code> regression which broke syntax
<code>varname(...)</code> which supposedly is allowed and inserts a
tacit multiplication.</li>
</ul>
<h2 id="b-20200225"><code>1.4b (2020/02/25)</code></h2>
<p>All changes regard the <strong>xintexpr</strong> module.</p>
<h3 id="future">Future</h3>
<ul>
<li><p><code>&amp;</code>, <code>|</code>, (as Boolean operators) and
<code>=</code> (as equality test) have long been deprecated in favour of
<code>&amp;&amp;</code>, <code>||</code> and <code>==</code>. They will
be removed at next major release.</p></li>
<li><p>At next major release the power operators <code>**</code> and
<code>^</code> will turn from left to right associative. I.e.
<code>2**2**3</code> will give <code>256</code>, not <code>64</code>.
This is to match with Python and l3fp.</p></li>
<li><p><code>\thexintexpr</code> et al. (introduced at <code>1.2h</code>
but not documented anymore for some time) will be removed at next major
release. The original <code>\xinttheexpr</code> et al. have always been
so much better names. Besides, since <code>1.4</code>,
<code>\xintexpr</code> can be used directly in typesetting
flow.</p></li>
</ul>
<h3 id="new-features-4">New features</h3>
<ul>
<li><p>Function <code>zip()</code> is modeled on Python’s function of
the same name.</p></li>
<li><p>Function <code>flat()</code> removes all nesting to produce a
“one-dimensional” list having the exact same leaves (some possibly
empty) as the original (in the same order).</p></li>
<li><p>Chaining of comparison operators (e.g. <code>x&lt;y&lt;z</code>)
as in Python (but all comparisons are done even if one is found false)
and l3fp.</p></li>
<li><p>It was possible since <code>1.4</code>’s
<code>\xintFracToSciE</code> to configure the separator between
mantissas and exponents in the output of <code>\xinteval</code> but
strangely there was no way to customize the output of
<code>\xintfloateval</code>. The added <code>\xintPFloatE</code> fixes
this.</p></li>
</ul>
<h3 id="bug-fixes-9">Bug fixes</h3>
<ul>
<li><code>\xintieval{[D]...}</code> with a negative <code>D</code> (a
feature added at <code>1.4a</code>) used erroneously a catcode 12
<code>e</code> in output, which moreover remained immuned to the
<code>\xintFracToSciE</code> setting.</li>
</ul>
<h2 id="a-20200219"><code>1.4a (2020/02/19)</code></h2>
<p>All changes regard the <strong>xintexpr</strong> module.</p>
<h3 id="breaking-changes-5">Breaking changes</h3>
<ul>
<li>The macros implementing customization of <code>\xintthealign</code>
have modified meanings and names.</li>
</ul>
<h3 id="new-features-5">New features</h3>
<ul>
<li><p><code>\xintthespaceseparated</code> (serves to provide suitable
input to PS-Tricks <code>\listplot</code>).</p></li>
<li><p>The optional argument <code>[D]</code> to
<code>\xintieval/\xintiexpr</code> can be negative, with the same
meaning as the non-negative case, i.e. rounding to an integer multiple
of <code>10^(-D)</code>.</p>
<p>The same applies to the functions <code>trunc()</code> and
<code>round()</code>. And to the <code>\xintTrunc</code>,
<code>\xintRound</code>, <code>\xintiTrunc</code>, and
<code>\xintiRound</code> macros of <strong>xintfrac</strong>.</p></li>
</ul>
<h3 id="bug-fixes-10">Bug fixes</h3>
<ul>
<li><p>Usage of <code>round()</code> and <code>trunc()</code> within
<code>\xintdeffunc</code> got broken at <code>1.4</code>.</p></li>
<li><p><code>add()</code> and <code>mul()</code> were supposedly
accepting the <code>omit</code>, <code>abort</code> and
<code>break()</code> keywords since <code>1.4</code> but this was
broken.</p></li>
</ul>
<h2 id="section"><code>1.4 (2020/01/31)</code></h2>
<h3 id="breaking-changes-6">Breaking changes</h3>
<p>Please note that this list may still be incomplete. If not otherly
specified all items regard the <strong>xintexpr</strong> module.</p>
<ul>
<li><p>The <code>\expanded</code> primitive (TeXLive 2019) is
<strong>required</strong>. This does not affect the macro layer
<strong>xintcore</strong>, <strong>xint</strong>,
<strong>xintfrac</strong>, <strong>xinttools</strong> (yet).</p></li>
<li><p>Formerly square brackets <code>[...]</code> were, on their own,
not different from parentheses (and thus disappeared from the output),
but they are now a genuine constructor of nested lists. For example
<code>\xinteval{1,    [2, [3, 4]], 5}</code> produces
<code>1, [2, [3, 4]], 5</code> (recall this is free bloatware).</p></li>
<li><p>The output of <code>\xinteval</code> has changed (besides
containing brackets). It does not use anymore the so-called <em>raw</em>
<strong>xintfrac</strong> format, i.e. things such as
<code>A/B[N]</code> (which can still be used in input but are
discouraged in <strong>xintexpr</strong> context), but scientific
notation <code>AeN/B</code>. As formerly, the denominator is printed
only if <code>B&gt;1</code> and the scientific part is dropped if the
exponent vanishes. In this way the output of <code>\xinteval</code> can
be pasted to alternative software.</p></li>
<li><p>The output format of <code>\xinthe\xintboolexpr</code> also has
changed. It uses <code>True</code> and <code>False</code> (which are
accepted on input), and this can easily be configured otherwise (also
<code>true</code> and <code>false</code> are accepted on
input).</p></li>
<li><p>The “broadcasting” (as it turned out, à la <code>NumPy</code>) of
scalar operations on one-dimensional “lists”, e.g
<code>3*[1,3,5,7]+10</code> acting itemwise is <strong>dropped</strong>.
It is hoped to implement such operations again in stronger form in
future releases. Pre-existing alternative syntax is available, also to
produce the bracketed (cf. next item) <code>[13,19,25,31]</code> which
will be the output in future.</p></li>
<li><p>The <code>divmod()</code> function now produces on output such a
bracketed pair, but simultaneous assignment such as
<code>\xintdefvar xq, xr =    divmod(a,b);</code> will work
transparently.</p></li>
<li><p>The syntax for using conditionals in function declarations has
changed. Now, one <em>must</em> use the <code>?</code> and
<code>??</code> short-circuit boolean branching operators whereas in the
past it was explained that the syntax had to use the <code>if()</code>
and <code>ifsgn()</code> functions.</p></li>
<li><p>Macros <code>\xintGCD</code>, <code>\xintLCM</code>,
<code>\xintGCDof</code> and <code>\xintLCMof</code> formerly provided by
<strong>xintgcd</strong> got moved to <strong>xintfrac</strong> (which
is not loaded by <strong>xintgcd</strong>). Moreover, they were extended
to handle general fractions on input but this also means that their
output is now obiding by the raw <strong>xintfrac</strong> format. The
integer only <code>\xintiiGCD</code>, <code>\xintiiLCM</code> also got
moved out of <strong>xintgcd</strong>, but to <strong>xint</strong>
which is now loaded automatically by <strong>xintgcd</strong>. The few
remaining macros of <strong>xintgcd</strong> at least do not need other
imports as <strong>xintgcd</strong> now loads also automatically
<strong>xinttools</strong> which is a dependency for two of
them.</p></li>
</ul>
<h3 id="improvements-and-new-features">Improvements and new
features</h3>
<p>Please note that this list is currently incomplete. For more
information look at the user manual and the documented source code
<code>sourcexint.pdf</code>.</p>
<p>Unless otherwise specified all changes commented upon here regard
<strong>xintexpr</strong>. Important: all the new syntax is to be
considered experimental. The author may change some names in future
release, or even the interface (whether to use semi-colons or colons
etc…).</p>
<ul>
<li><p>The <code>\csname</code> encapsulation technique used since
<strong>xintexpr</strong> initial release (<code>1.07 2013/05/25</code>)
to move around possibly large data during expansion-only operations is
replaced with methods based on the <code>\expanded</code> engine
primitive. The latter is available in all major engines since TeXLive
2019.</p>
<p>Formerly, and with default memory settings, one would typically
saturate the string pool memory after about of the order of 50,000
independent floating point evaluations of expressions of average
complexity on 16-digits numbers.</p>
<p>There is thus no string pool memory impact at all but one can now hit
TeX’s main memory limit (which typically stands at 5,000,000 words) from
defining large variables or generating on the fly large data. TeX
distributions have a configuration file allowing to enlarge TeX memory
parameters and regenerate the (eTeX based) formats.</p></li>
<li><p>The package supports input and output of arbitrarily <em>nested
lists</em>, a.k.a. <em>oples</em> or <em>nlists</em>, with
<code>[...]</code> as the constructor of <em>bracketed lists</em>, a.k.a
<em>nut-ples</em>. Operations on these objects (as briefly surveyed in
later items) are inspired from syntax and functionalities of
<code>NumPy</code>’s <em>ndarrays</em>. Our <em>oples</em> (hence also
their packaged form <em>nut-ples</em>) may have <em>leaves</em> at
varying depths rather than obeying an N-dimensional hyperrectangular
shape. But the syntax does provide specific constructors for
<em>ndlists</em> (i.e. hyperrectangular <em>oples</em> or
<em>nut-ples</em>).</p>
<p>In a (distant?) future, perhaps <strong>xintexpr</strong> itself or a
third-party package will provide an interface, say
<code>\xintstorearray</code>, <code>\xintgetarray</code>, to store
(which can not be expandable) and retrieve (which can be expandable and
thus be embedded inside expressions parsed by <code>\xintexpr</code>,
<code>\xintiiexpr</code> or <code>\xintfloatexpr</code>) such
<em>ndlists</em> from TeX memory. This is why the package does not use
the word <em>ndarray</em> and reserves it for such memory stored
objects.</p></li>
<li><p>The <code>*</code> serves as <em>unpacking</em> operator on
<em>nut-ples</em>, i.e. reversing the <code>[]</code> bracketing of an
<em>ople</em>.</p></li>
<li><p><em>oples</em> have no exact equivalent in <code>Python</code>.
For example <strong>xintexpr</strong> allows <code>foo(Var1, x)</code>
if <code>foo</code> is a function of 4 variables and <code>Var1</code>
is a variable producing a length 3 <em>ople</em>, or
<code>foo(Var2)</code> if <code>Var2</code> is a variable producing a
length 4 <em>ople</em>. Python would require here to use explicitly the
<code>*</code>-unpacking notation on some “packed” objects.</p>
<p>Variable and function values may be <em>oples</em> (even
<em>nil</em>), but in function declarations variables must stand for
<em>one-ples</em>, i.e. either <em>numbers</em> or <em>nut-ples</em> (as
there is no non-ambiguous way to split e.g. 5 arguments into two
separate <em>oples</em>).</p></li>
<li><p>Simultaneous assignment to at least two variables via
<code>\xintdefvar</code> et al. automatically unpacks the assigned value
if it is a <em>one-ple</em>. If this value was in fact a
<em>number</em>, low-level errors will result shortly afterwards as no
check is done if the unpacking was illicit. (update: this last remark
does not apply since the <code>1.4i</code> extension to the concept of
simultaneous assignments)</p></li>
<li><p>The <code>NumPy</code> concept and syntax for nested slicing and
item selection are implemented. Currently <em>stepping</em> and the
<em>Ellipsis object</em> are not yet available. Only so-called basic
slicing is currently supported. (The author has not yet read the section
of <code>NumPy</code> documentation on so-called <em>advanced
indexing</em>).</p></li>
<li><p>The <em>broadcasting</em> of scalar operations, such as itemwise
addition or multiplication of <em>nut-ples</em> of the same shape is
<strong>not yet implemented</strong>.</p></li>
<li><p>Slicing and indexing apply also at top level to the
<em>oples</em> with behaviour conforming to intuitive expectations (see
user manual); if it turns out the <em>ople</em> is in fact a
<em>nut-ple</em>, the top-level slicing/indexing switches to the
<code>Python/NumPy</code> conventions, i.e. it operates inside the
brackets for slicing and removes brackets if indexing.</p></li>
<li><p>The syntax
<code>ndseq(expression in x, y, ..., x = values; y = values;    ...)</code>
constructs a (bracketed) <em>ndlist</em> by evaluation the expression on
all possible Cartesian n-uples, where the first variable indexes the
first axis, the second the next, etc…</p></li>
<li><p>The <code>ndmap(foo, values1; values2; ...; valuesN)</code>
syntax constructs a (bracketed) <em>ndlist</em> by evaluating the
function <code>foo</code> on all elements of the cartesian product of
the given (one-dimensional) value lists.</p></li>
<li><p>The two concepts of <code>\xintdeffunc</code> (for recursive
definitions) and <code>\xintdefefunc</code> (for functions which expand
immediately in other function declarations) have been merged. The
<code>\xintdefefunc</code> et al. are deprecated and kept as aliases for
<code>\xintdeffunc</code> et al.</p></li>
<li><p><code>\xintdefufunc</code> allows to define so-called
<em>universal functions</em>, i.e. functions <code>foo</code> such that
<code>foo(myople)</code> will apply itemwise at arbitrary depth in the
nested structure. The function <code>foo</code> is allowed to produce
from a scalar an <em>ople</em>…</p></li>
<li><p>The variables in function declarations can now be multi-letter
words.</p></li>
<li><p>The last positional variable in a function declaration can be
prefixed with a <code>*</code> meaning exactly as in Python
(<em>variadic</em> function argument) that it stands for a
one-dimensional <em>nut-ple</em> receiving all remaining arguments from
the function call beyond the first positional ones. It is thus an
optional argument, but syntax for named optional arguments with default
values is not yet implemented.</p></li>
<li><p>Dummy variables used in constructors can also be multi-letter
words, if they have been declared as such.</p></li>
<li><p>In variable and function declarations, if the expression contains
inner semi-colons, it is not needed anymore to brace them to avoid
mis-interpretation as the final semi-colon which is mandated by the
syntax to serve as expression terminator.</p></li>
<li><p><code>subsm(expression, var1 = value1; var2 = value2; ...)</code>
provides a leaner syntax for multiple substitutions; they must be
independent, though.</p></li>
<li><p><code>subsn(expression, var1 = value1; var2 = value2; ...)</code>
provides a leaner syntax for nested substitutions, i.e., each
<code>valueJ</code> may be an expression using the dummy variables
<code>varK</code> with <code>K&gt;J</code>. And finally of course the
evaluated expression can refer to all variables.</p></li>
<li><p><code>\xintthealign\xintexpr...\relax</code> (or with
<code>\xintfloatexpr</code> or <code>\xintiiexpr</code> or
<code>\xintboolexpr</code>…) will use a TeX alignment to display
<em>oples</em>. The output (for regular N-dimensional lists) looks very
similar to what <code>Python/NumPy</code> produces in interactive
session. This is entirely configurable and can also be set-up to be used
for writing into external files.</p>
<p>Attention that <code>\xintthealign</code> only works if followed by
<code>\xintexpr</code> et al., not by <code>\xinteval{}</code>.</p></li>
<li><p>It is now possible to use <code>\xintexpr...\relax</code>
directly for typesetting. The syntax <code>\xinteval{...}</code> or
<code>\xintthe\xintexpr...\relax</code> is needed only if one wants the
expansion to give the explicit digits, but
<code>\xintexpr...\relax</code> by itself will typeset as would have the
other ones. Further it can be used in so-called moving arguments,
because when output to an external file it uses only characters with
standard catcodes (and produces the same protected and re-tokenizable
result it would in an <code>\edef</code>.)</p>
<p>As formerly, <code>\xintexpr...\relax</code> is the preferred way to
include an expression into another one. Using <code>\xinteval</code> is
a waste because it forces the outer parser to re-digest all the digits
(or now also the square brackets).</p></li>
<li><p>The output format of <code>\xintfloateval</code> with scientific
notation has not changed (apart from possible presence of bracketed
lists), but the author hesitates because the <em>prettifying</em> it
does by default is not really adapted to display of arrays (see
<code>\xintthealign</code>). Anyway, this is configurable by the user.
It is possible to specify whether to use <code>e</code> or
<code>E</code>.</p></li>
<li><p>Function declarations are able to parse a much wider part of the
syntax, but some severe limitations remain. Refer to the user manual for
related information.</p></li>
<li><p>We have made an effort on some error messages, and when working
interactively in a shell it may even be sometimes possible to insert for
example a correct variable or function name in place of the not
recognized one. But don’t expect miracles when trying to intervene in
the midst of a purely expandable expansion…</p></li>
</ul>
<h3 id="bug-fixes-11">Bug fixes</h3>
<p>Bugs? Those identified in <code>1.3f</code> were almost features. As
per <code>1.4</code> the code base of <strong>xintexpr</strong> received
multiple successive core refactorings and added numerous new features,
and our test suite although significantly enlarged is not yet extensive
enough. Please report bugs by mail.</p>
<h3 id="todo">TODO</h3>
<ul>
<li><p>The long delayed overhaul of how floating point numbers are
handled is delayed again. It has remained basically identical to its
initial provisory version from <code>1.07 2013/05/25</code> (which was
based upon what was originally only a set of expandable macros for
computations with big integers), and suffers from the author lack of
knowledge of the notion of “data type” in modern programming. Indeed, he
never took a CS class, and disables JavaScript in his browser (or allows
only select non-tracking scripts, a rare beast in modern days).</p></li>
<li><p>Prior to integrating all of <code>NumPy</code>, it is envisioned
to start with matrix algebra first.</p></li>
</ul>
<h2 id="f-20190910"><code>1.3f (2019/09/10)</code></h2>
<h3 id="improvements-and-new-features-1">Improvements and new
features</h3>
<ul>
<li><p><strong>xintfrac</strong>: <code>\xintDigits = P;</code> syntax
(i.e. without a colon) is now accepted in addition to
<code>\xintDigits := P;</code>.</p>
<p>Document that the ending semi-colon can not be an active character
and that it has always been allowed to use in its place a non-expanding
token e.g. <code>\xintDigits := 32\relax</code>.</p>
<p>Add <code>\xintSetDigits</code>.</p></li>
<li><p><strong>xintexpr</strong>: add starred variants
<code>\xintDigits*</code> and <code>\xintSetDigits*</code> which execute
<code>\xintreloadxinttrig</code>.</p>
<p>Revert 1.3e ban on usage of <code>\xinteval</code> et al. inside
expressions by <code>\xintdeffunc</code>. And make them usable also
inside macro definitions via <code>\xintNewExpr</code>.</p></li>
</ul>
<h3 id="bug-fixes-12">Bug fixes</h3>
<ul>
<li><p><strong>xintexpr</strong>: fix bug preventing usage of
<code>\xintdefefunc</code> to define a function without variables.</p>
<p>Fix some issue with <code>\xintfloatexpr[D]..\relax</code> if used
inside an expression parsed by <code>\xintdeffunc</code> et al.</p></li>
</ul>
<h2 id="e-20190405"><code>1.3e (2019/04/05)</code></h2>
<h3 id="breaking-changes-7">Breaking changes</h3>
<ul>
<li>(<em>reverted at 1.3f</em>) When defining functions, sub-expressions
can only use the <code>\xint(float)expr...\relax</code> syntax. One can
not use there the <code>\xint(float)eval</code> wrappers.</li>
</ul>
<h3 id="improvements-and-new-features-2">Improvements and new
features</h3>
<ul>
<li><p>The <strong>xinttrig</strong> library is automatically loaded by
<strong>xintexpr</strong>. It provides direct and inverse
trigonometrical functions using either degrees or radians with a
precision of up to (a bit less than) 60 digits. It is for the most part
implemented using high level user interface, but will probably get some
optimizations in future (and perhaps extension to more digits).</p></li>
<li><p>The <strong>xintlog</strong> library is automatically loaded by
<strong>xintexpr</strong>. It uses <a
href="http://ctan.org/pkg/poormanlog">poormanlog</a> to provide
logarithms and exponentials with almost 9 digits of precision. Extended
precision is for a future release.</p></li>
<li><p><strong>xintexpr</strong>: <code>\xintdefefunc</code>,
<code>\xintdeffloatefunc</code>, <code>\xintdefiiefunc</code> define
functions which are not protected against expansion in the definition of
other functions; refer to <code>xint.pdf</code> for the related
explanations.</p>
<p>Notice that whole area of <code>\xintdef(e)func</code>,
<code>\xintNewExpr</code>, <code>\xintNewFunction</code> is complex and
to be considered still as work in progress as it has a number of
shortcomings.</p></li>
<li><p><strong>xintexpr</strong>: <code>inv()</code>,
<code>ilog10()</code>, <code>sfloat()</code>, behaviour of
<code>qfloat()</code> slightly modified.</p></li>
<li><p><strong>xintexpr</strong>: <code>\xintensuredummy</code>,
<code>\xintrestorelettervar</code>.</p></li>
<li><p>The optional argument of <code>\xintfloatexpr</code> or
<code>\xintfloateval</code> (it must be at start of braced argument) can
be negative; it then means to trim (and round) from the output at float
precision that many least significant digits.</p></li>
</ul>
<h3 id="bug-fixes-13">Bug fixes</h3>
<ul>
<li>Some bugfixes related to user functions with no variables at all;
they were dysfunctional.</li>
</ul>
<h2 id="d-20190106"><code>1.3d (2019/01/06)</code></h2>
<h3 id="breaking-changes-8">Breaking changes</h3>
<ul>
<li><p><strong>xintexpr</strong>: the <code>gcd()</code> and
<code>lcm()</code> functions formerly converted their arguments to
integers via <code>\xintNum</code>. They now handle general input with
no such modification.</p></li>
<li><p><strong>xintexpr</strong>: former <code>\xinteval</code>,
<code>\xintieval</code>, <code>\xintiieval</code>, and
<code>\xintfloateval</code> renamed to <code>\xintexpro</code>,
<code>\xintiexpro</code>, <code>\xintiiexpro</code>, and
<code>\xintfloatexpro</code>.</p></li>
</ul>
<h3 id="improvements-and-new-features-3">Improvements and new
features</h3>
<ul>
<li><p><strong>xintexpr</strong>: the <code>gcd()</code> and
<code>lcm()</code> multi-arguments functions have been refactored to
handle general fractions. The dependency on <strong>xintgcd</strong> is
removed.</p></li>
<li><p><strong>xintexpr</strong>: three-way branching
<code>\xintifsgnexpr</code>, <code>\xintifsgnfloatexpr</code>,
<code>\xintifsgniiexpr</code> conditional macros.</p></li>
<li><p><strong>xintexpr</strong>: <code>\xintunassignexprfunc</code>,
<code>\xintunassigniiexprfunc</code>,
<code>\xintunassignfloatexprfunc</code> to “undefine”
functions.</p></li>
<li><p><strong>xintexpr</strong>: <code>\xintunassignvar</code> really
makes the (multi-letter) variable unknown (formerly, it only gave it
value zero),</p></li>
<li><p><strong>xintexpr</strong>: functions <code>isone()</code> and
<code>isint()</code>.</p></li>
<li><p><strong>xintexpr</strong>: <code>\xinteval</code>,
<code>\xintieval</code>, <code>\xintiieval</code>, and
<code>\xintfloateval</code> as synonyms to
<code>\xinttheexpr...\relax</code> etc…, but with the (comma-separated)
expression as a usual braced macro argument.</p></li>
</ul>
<h3 id="bug-fixes-14">Bug fixes</h3>
<ul>
<li><strong>xintcore</strong>, <strong>xintexpr</strong> : division in
<code>\xintiiexpr</code> was broken for a zero dividend and a one-digit
divisor (e.g. <code>0//7</code>) since <code>1.2p</code> due to a bug in
<code>\xintiiDivMod</code> for such arguments. The bug was signaled
(thanks to Kpym for report) and fixed shortly after <code>1.3c</code>
release but I then completely forgot to upload a bugfix release to CTAN
at that time, apologies for that.</li>
</ul>
<h2 id="c-20180617"><code>1.3c (2018/06/17)</code></h2>
<h3 id="improvements-and-new-features-4">Improvements and new
features</h3>
<ul>
<li><p><strong>xintexpr</strong>: with <code>\xintglobaldefstrue</code>,
<code>\xintdefvar</code>, <code>\xintdeffunc</code>,
<code>\xintNewExpr</code> et al. make definitions with global
scope.</p></li>
<li><p><strong>xintexpr</strong>: <code>qraw()</code> for fast input of
(very many) comma separated numbers (in suitable raw format).</p></li>
<li><p><strong>xintexpr</strong>: the colon in the <code>:=</code> part
of the syntax for <code>\xintdefvar</code> and variants is now optional;
and if present it may be an active character or have any (reasonable)
catcode.</p></li>
<li><p><strong>xintexpr</strong>: <code>\xintdefvar</code>,
<code>\xintdeffunc</code> and their variants try to set the catcode of
the semi-colon which delimits their arguments; of course this will not
work if that catcode is already frozen.</p></li>
<li><p><code>\xintUniformDeviate</code> is better documented and
<code>sourcexint.pdf</code> is better hyperlinked and includes indices
for the macros defined by each package.</p></li>
</ul>
<h3 id="bug-fixes-15">Bug fixes</h3>
<ul>
<li><strong>xintfrac</strong>: since <code>1.3</code> release, it loaded
<strong>xintgcd</strong> in contradiction to what the documentation says
(hence also <strong>xintexpr</strong> loaded <strong>xintgcd</strong>
automatically). There is no actual dependency so the loading is removed
for now.</li>
</ul>
<h2 id="b-20180518"><code>1.3b (2018/05/18)</code></h2>
<h3 id="improvements-and-new-features-5">Improvements and new
features</h3>
<p>All additions related to randomness are marked as work-in-progress.
They require an engine providing the <code>\(pdf)uniformdeviate</code>
primitive.</p>
<ul>
<li><p><strong>xintkernel</strong>:
<code>\xintUniformDeviate</code>.</p></li>
<li><p><strong>xint</strong>: <code>\xintRandomDigits</code>,
<code>\xintXRandomDigits</code>, <code>\xintiiRandRange</code>,
<code>\xintiiRandRangeAtoB</code>.</p></li>
<li><p><strong>xintfrac</strong>: support macros (not public, mainly
because internal format for floats is surely not final) for
<code>random()</code> and <code>qrand()</code>.</p></li>
<li><p><strong>xintexpr</strong>: <code>random()</code>,
<code>qrand()</code>, and <code>randrange(A[, B])</code>.</p></li>
<li><p><strong>xintexpr</strong>: when a function <code>foo()</code> is
declared via <code>\xintdeffunc</code> (et al.) to be parameter-less, it
can be used as <code>foo()</code>; formerly <code>foo(nil)</code> syntax
was required.</p></li>
<li><p>The usual provision of user manual “improvements”.</p></li>
</ul>
<h2 id="a-20180307"><code>1.3a (2018/03/07)</code></h2>
<h3 id="removed">Removed</h3>
<ul>
<li><strong>xintcore</strong>, <strong>xint</strong>,
<strong>xintfrac</strong>: removal of the internal macros which were
used at <code>1.2o</code> to add a deprecation mechanism; all deprecated
macros have been removed at <code>1.3</code> so there was no reason to
keep the code used for deprecating them.</li>
</ul>
<h3 id="improvements-and-new-features-6">Improvements and new
features</h3>
<ul>
<li><p><strong>xintexpr</strong>: new conditionals <code>ifone()</code>
and <code>ifint()</code>.</p></li>
<li><p><strong>xintfrac</strong>: <code>\xintREZ</code> is faster on
inputs having one hundred digits or more.</p></li>
<li><p>Added to the user manual mention of macros such as
<code>\xintDivFloor</code>, <code>\xintMod</code>,
<code>\xintModTrunc</code>, which had been left out so far.</p></li>
</ul>
<h3 id="bug-fixes-16">Bug fixes</h3>
<ul>
<li><strong>xintexpr</strong>: the mechanism for adjunction to the
expression parsers of user defined functions was refactored and improved
at previous release <code>1.3</code>: in particular recursive
definitions became possible. But an oversight made these recursive
functions quite inefficient (to remain polite.) This release fixes the
problem.</li>
</ul>
<h2 id="section-1"><code>1.3 (2018/03/01)</code></h2>
<h3 id="breaking-changes-9">Breaking changes</h3>
<ul>
<li><p><strong>xintcore</strong>, <strong>xint</strong>,
<strong>xintfrac</strong>: all macros deprecated at <code>1.2o</code>
got removed.</p></li>
<li><p><strong>xintfrac</strong>: addition and subtraction of
<code>a/b</code> and <code>c/d</code> now use the l.c.m. of the
denominators. Similarly the macro supporting the modulo operator
<code>/:</code> uses a l.c.m. for the denominator of the
result.</p></li>
<li><p><strong>xintexpr</strong>: the addition, subtraction, modulo
<code>/:</code>, and the <code>mod()</code> and <code>divmod()</code>
functions produce generally smaller denominators (see previous
item).</p></li>
<li><p><strong>xintexpr</strong>: formerly, the internal macros which
are internally associated to user-declared functions were using comma
separated parameter texts. They now do not use such commas (their
meanings, which may again change in future, are written for information
to the log under <code>\xintverbosetrue</code>).</p></li>
</ul>
<h3 id="improvements-and-new-features-7">Improvements and new
features</h3>
<ul>
<li><p><strong>xintexpr</strong>: user-defined functions may now be of a
recursive nature. This was made possible by a refactoring of the
<code>\xintNewExpr</code> mechanism. It became both leaner and more
extensive than formerly.</p></li>
<li><p><strong>xintfrac</strong>: new macros <code>\xintPIrr</code> and
<code>\xintDecToString</code>. The latter is a backport of a
<code>polexpr 0.4</code> utility, and it is to be considered
unstable.</p></li>
<li><p><strong>xintexpr</strong>: new function <code>preduce()</code>
associated with <code>\xintPIrr</code>.</p></li>
</ul>
<h2 id="q-20180206"><code>1.2q (2018/02/06)</code></h2>
<h3 id="improvements-and-new-features-8">Improvements and new
features</h3>
<ul>
<li><strong>xintexpr</strong>: tacit multiplication extended to cases
such as <code>3!4!5!</code> or <code>(1+2)3</code>.</li>
</ul>
<h3 id="bug-fixes-17">Bug fixes</h3>
<ul>
<li><strong>xintcore</strong>: sadly, refactoring at <code>1.2l</code>
of subtraction left an extra character in an inner macro causing
breakage in some rare circumstances. This should not have escaped our
test suite!</li>
</ul>
<h2 id="p-20171205"><code>1.2p (2017/12/05)</code></h2>
<h3 id="breaking-changes-10">Breaking changes</h3>
<ul>
<li><p><strong>xintgcd</strong>: <code>\xintBezout{a}{b}</code>’s output
consists of <code>{u}{v}{d}</code> with <code>u*a+v*b==d</code>, with
<code>d</code> the GCD. Formerly it was <code>{a}{b}{u}{v}{d}</code>,
and with <code>u*a-v*b==d</code>.</p></li>
<li><p><strong>xintgcd</strong>: <code>\xintBezout{0}{0}</code> expands
to <code>{0}{0}{0}</code>. Formerly (since <code>1.2l</code>) it raised
<code>InvalidOperation</code>.</p></li>
<li><p><strong>xintcore</strong>: <code>\xintiiMod</code> is now
associated with floored division. The former meaning (associated with
truncated division) is available as
<code>\xintiiModTrunc</code>.</p></li>
<li><p><strong>xintfrac</strong>: <code>\xintMod</code> is now
associated with floored division. The former meaning is available as
<code>\xintModTrunc</code>.</p></li>
<li><p><strong>xintexpr</strong>: the <code>//</code> operator and its
associated modulo <code>'mod'</code> (or <code>/:</code>) now correspond
to floored division, like the Python language <code>//</code>,
<code>%</code>, and <code>divmod(x, y)</code>. Formerly they had been
associated to truncated division. This is breaking change for operands
of opposite signs.</p></li>
</ul>
<h3 id="improvements-and-new-features-9">Improvements and new
features</h3>
<ul>
<li><p><strong>xinttools</strong>: <code>\xintListWithSep</code>, which
had remained unchanged since its introduction at
<code>1.04 (2013/04/25)</code>, was rewritten for increased
speed.</p></li>
<li><p><strong>xintexpr</strong>: <code>\xintdefvar</code>’s syntax is
extended to allow simultaneous assignments. Examples:
<code>\xintdefvar x1, x2, x3 := 1, 3**10, 3**20;</code> or
<code>\xintdefiivar A, B := B, A 'mod' B;</code> for already defined
variables <code>A</code> and <code>B</code>.</p></li>
<li><p><strong>xintexpr</strong>: added <code>divmod()</code> to the
built-in functions. It is associated with floored division, like the
Python language <code>divmod()</code>. Related support macros added to
<strong>xintcore</strong>, and <strong>xintfrac</strong>.</p></li>
</ul>
<h3 id="bug-fixes-18">Bug fixes</h3>
<ul>
<li><p><strong>xintgcd</strong>: <code>\xintBezout{6}{3}</code> (for
example) expanded to <code>{6}{3}{-0}{-1}{3}</code>, but the
<code>-0</code> should have been <code>0</code>.</p></li>
<li><p><strong>xintgcd</strong>: it still used macro
<code>\xintiAbs</code> although the latter had been deprecated from
<strong>xintcore</strong>.</p></li>
<li><p><strong>xintexpr</strong>: in float expressions the
<code>//</code> and <code>/:</code> (aka <code>'mod'</code>) operators
did not round their operands to the float precision prior to computing
with them, contrarily to other infix arithmetic operators and to the
<code>mod(f,g)</code> function; thus, <code>mod(f,g)</code> and
<code>f 'mod' g</code> were not completely equivalent.</p></li>
<li><p>various documentation fixes; in particular, the partial
dependency of <strong>xintcfrac</strong> on <strong>xinttools</strong>
had not been mentioned.</p></li>
</ul>
<h2 id="o-20170829"><code>1.2o (2017/08/29)</code></h2>
<h3 id="breaking-changes-11">Breaking changes</h3>
<ul>
<li><strong>xint</strong>: <code>\xintAND</code>, <code>\xintOR</code>,
… and similar Boolean logic macros do not apply anymore
<code>\xintNum</code> (or <code>\xintRaw</code> if
<strong>xintfrac</strong> is loaded), to their arguments (often, from
internal usage of <code>\xintSgn</code>), but only f-expand them (using
e.g. <code>\xintiiSgn</code>). This is kept un-modified even if loading
<strong>xintfrac</strong>.</li>
</ul>
<h3 id="deprecated-1">Deprecated</h3>
<p>Deprecated macros raise an error but, generally, then expand as in
former releases. They will all get removed at some future release.</p>
<ul>
<li><p><strong>xintcore</strong>: <code>\xintiOpp</code>,
<code>\xintiAbs</code>, <code>\xintiAdd</code>, <code>\xintiSub</code>,
<code>\xintiMul</code>, <code>\xintiDivision</code>,
<code>\xintiQuo</code>, <code>\xintiRem</code>,
<code>\xintiDivRound</code>, <code>\xintiDivTrunc</code>,
<code>\xintiMod</code>, <code>\xintiSqr</code>, <code>\xintiPow</code>,
and <code>\xintiFac</code> are deprecated. Only the
<code>ii</code>-named variants get defined.</p></li>
<li><p><strong>xintcore</strong>: <code>\xintCmp</code> and
<code>\xintSgn</code> are deprecated from <strong>xintcore</strong>
(which only defines <code>\xintiiCmp</code> and <code>\xintiiSgn</code>)
as they actually belong to <strong>xintfrac</strong>.</p></li>
<li><p><strong>xintcore</strong>: <code>\xintiiFDg</code>, resp.
<code>\xintiiLDg</code>, are renamed <code>\xintFDg</code>, resp.
<code>\xintLDg</code>. Former denominations are deprecated.</p></li>
<li><p><strong>xint</strong>: <code>\xintMON</code>,
<code>\xintMMON</code>, <code>\xintiMax</code>, <code>\xintiMin</code>,
<code>\xintiMaxof</code>, <code>\xintiMinof</code>,
<code>\xintiSquareRoot</code>, <code>\xintiSqrt</code>,
<code>\xintiSqrtR</code>, <code>\xintiBinomial</code>, and
<code>\xintiPFactorial</code> are deprecated. Only <code>ii</code>-named
variants get defined.</p></li>
<li><p><strong>xint</strong>: <code>\xintEq</code>,
<code>\xintGeq</code>, <code>\xintGt</code>, <code>\xintLt</code>,
<code>\xintGtorEq</code>, <code>\xintLtorEq</code>,
<code>\xintIsZero</code>, <code>\xintIsNotZero</code>,
<code>\xintIsOne</code>, <code>\xintOdd</code>, <code>\xintEven</code>,
<code>\xintifSgn</code>, <code>\xintifCmp</code>,
<code>\xintifEq</code>, <code>\xintifGt</code>, <code>\xintifLt</code>,
<code>\xintifZero</code>, <code>\xintifNotZero</code>,
<code>\xintifOne</code>, <code>\xintifOdd</code>, are deprecated. These
macros belong to <strong>xintfrac</strong>. Package
<strong>xint</strong> defines only the <code>ii</code>-named
variants.</p></li>
<li><p><strong>xint</strong>: <code>\xintNeq</code> was renamed to
<code>\xintNotEq</code> which however is only provided by
<strong>xintfrac</strong>. Package <strong>xint</strong> defines
<code>\xintiiNotEq</code>, and <code>\xintNeq</code> is
deprecated.</p></li>
<li><p><strong>xint</strong>: <code>\xintNot</code> was renamed to
<code>\xintNOT</code>, former denomination is deprecated. See also item
about Boolean logic macros in the <em>Incompatible Changes</em>
section.</p></li>
</ul>
<h2 id="n-20170806"><code>1.2n (2017/08/06)</code></h2>
<h3 id="breaking-changes-12">Breaking changes</h3>
<ul>
<li><strong>xintbinhex</strong> does not load package
<strong>xintcore</strong> anymore, but only
<strong>xintkernel</strong>.</li>
</ul>
<h3 id="improvements-and-new-features-10">Improvements and new
features</h3>
<ul>
<li><p><strong>xintbinhex</strong> has only <strong>xintkernel</strong>
as dependency.</p></li>
<li><p>Macros of <strong>xintbinhex</strong> have been improved for
speed and increased maximal sizes of allowable inputs.</p></li>
</ul>
<h2 id="m-20170731"><code>1.2m (2017/07/31)</code></h2>
<h3 id="breaking-changes-13">Breaking changes</h3>
<ul>
<li><p><strong>xintbinhex</strong>: the length of the input is now
limited. The maximum size depends on the macro and ranges from about
<code>4000</code> to about <code>19900</code> digits.</p></li>
<li><p><strong>xintbinhex</strong>: <code>\xintCHexToBin</code> is now
the variant of <code>\xintHexToBin</code> which does not remove leading
binary zeroes: <code>N</code> hex-digits give on output exactly
<code>4N</code> binary digits.</p></li>
</ul>
<h3 id="improvements-and-new-features-11">Improvements and new
features</h3>
<ul>
<li><strong>xintbinhex</strong>: all macros have been rewritten using
techniques from the 1.2 release (they had remained unmodified since
<code>1.08</code> of <code>2013/06/07</code>.) The new macros are faster
but limited to a few thousand digits. The <code>1.08</code> routines
could handle tens of thousands of digits, but not in a reasonable
time.</li>
</ul>
<h3 id="bug-fixes-19">Bug fixes</h3>
<ul>
<li><p>user manual: the <code>Changes</code> section wrongly stated at
<code>1.2l</code> that the macros of <strong>xintbinhex</strong> had
been made robust against non terminated input such as
<code>\number\mathcode`\-</code>. Unfortunately the author fell into the
trap of believing his own documentation and he forgot to actually
implement the change. Now done.</p></li>
<li><p>user manual: the PDF bookmarks were messed up.</p></li>
<li><p><strong>xint</strong>, <strong>xintfrac</strong>:
<code>\xintGeq</code>, <code>\xintMax</code>, <code>\xintMin</code>,
suffered from some extra overhead. This was caused by use of some
auxiliaries from the very early days which got redefined at some stage.
This is fixed here with some additional efficiency improvements and
pruning of old code.</p></li>
</ul>
<h2 id="l-20170726"><code>1.2l (2017/07/26)</code></h2>
<h3 id="removed-1">Removed</h3>
<ul>
<li><p><code>\xintiiSumExpr</code>, <code>\xintiiPrdExpr</code>
(<strong>xint</strong>) and <code>\xintSumExpr</code>,
<code>\xintPrdExpr</code> (<strong>xintfrac</strong>). They had not been
formally deprecated, but had been left un-documented since
<code>1.09d (2013/10/22)</code>.</p></li>
<li><p>internal macro <code>\xint_gob_til_xint_relax</code>
removed.</p></li>
</ul>
<h3 id="improvements-and-new-features-12">Improvements and new
features</h3>
<ul>
<li><p>the underscore character <code>_</code> is accepted by the
<strong>xintexpr</strong> parsers as a digit separator (the space
character already could be used for improved readability of big
numbers). It is not allowed as <em>first</em> character of a number, as
it would then be mis-interpreted as the start of a possible variable
name.</p></li>
<li><p>some refactoring in <strong>xintcore</strong> auxiliary routines
and in <code>\xintiiSub</code> and <code>\xintiiCmp</code> for some
small efficiency gains.</p></li>
<li><p>code comments in <strong>xintcore</strong> are better formatted,
but remain sparse.</p></li>
<li><p><strong>xintcore</strong>, <strong>xint</strong>,
<strong>xintfrac</strong>, … : some macros were not robust against
arguments whose expansion looks forward for some termination
(e.g. <code>\number\mathcode`\-</code>), and particularly, most were
fragile against inputs using non-terminated <code>\numexpr</code> (such
as <code>\xintiiAdd{\the\numexpr1}{2}</code> or
<code>\xintRaw{\numexpr1}</code>). This was not a bug per se, as the
user manual did not claim such inputs were legal, but it was slightly
inconvenient. Most macros (particularly those of
<strong>xintfrac</strong>) have now been made robust against such
inputs. Some macros from <strong>xintcore</strong> primarily destined to
internal usage still accept only properly terminated arguments such as
<code>\the\mathcode`\-&lt;space&gt;</code> or
<code>\the\numexpr1\relax</code>.</p>
<p>The situation with expressions is unchanged: syntax such as
<code>\xintexpr \numexpr1+2\relax</code> is illegal as the ending
<code>\relax</code> token will get swallowed by the
<code>\numexpr</code>; but it is needed by the
<code>xintexpr</code>-ession parser, hence the parser will expand
forward and presumably end with in an “illegal token” error, or provoke
some low-level TeX error (N.B.: a closing brace <code>}</code> for
example can not terminate an <code>xintexpr</code>-ession, the parser
must find a <code>\relax</code> token at some point). Thus there must be
in this example a second <code>\relax</code>.</p></li>
<li><p>experimental code for error conditions; there is no complete user
interface yet, it is done in preparation for next major release and is
completely unstable and undocumented.</p></li>
</ul>
<h3 id="bug-fixes-20">Bug fixes</h3>
<ul>
<li><p><strong>xintbinhex</strong>: since <code>1.2 (2015/10/10)</code>,
<code>\xintHexToDec</code> was broken due to an undefined macro (it was
in <code>xint.sty</code>, but the module by itself is supposedly
dependent only upon <code>xintcore.sty</code>).</p></li>
<li><p><strong>xintgcd</strong>: macro <code>\xintBezout</code> produced
partially wrong output if one of its two arguments was zero.</p></li>
<li><p><strong>xintfrac</strong>: the manual said one could use directly
<code>\numexpr</code> compatible expressions in arithmetic macros
(without even a <code>\numexpr</code> encapsulation) if they were
expressed with up to 8 tokens. There was a bug if these 8 tokens
evaluated to zero. The bug has been fixed, and up to 9 tokens are now
accepted. But it is simpler to use <code>\the\numexpr</code> prefix and
not to worry about the token count… The ending <code>\relax</code> is
now un-needed.</p></li>
</ul>
<h2 id="k-20170106"><code>1.2k (2017/01/06)</code></h2>
<h3 id="breaking-changes-14">Breaking changes</h3>
<ul>
<li><p>macro <code>\xintFloat</code> which rounds its input to a
floating point number does <em>not</em> print anymore
<code>10.0...0eN</code> to signal an upwards rounding to the next power
of ten. The mantissa has in all cases except the zero input exactly one
digit before the decimal mark.</p></li>
<li><p>some floating point computations may differ in the least
significant digits, due to a change in the rounding algorithm applied to
macro arguments expressed as fractions and to an improvement in
precision regarding half-integer powers in expressions. See
next.</p></li>
</ul>
<h3 id="improvements-and-new-features-13">Improvements and new
features</h3>
<ul>
<li><p>the initial rounding to the target precision <code>P</code> which
is applied by the floating point macros from <strong>xintfrac</strong>
to their arguments achieves the <em>exact (aka correct) rounding</em>
even for inputs which are fractions with more than <code>P+2</code>
digits in their numerators and denominators (<code>&gt;1</code>.) Hence
the computed values depend only on the arguments as rational numbers and
not upon their representatives. This is not relevant to
<em>expressions</em> (<strong>xintexpr</strong>), because the
<code>\xintfloatexpr</code> parser sees there <code>/</code> as an
operator and does not (apart from special constructs) get to manipulate
fractions as such.</p></li>
<li><p><code>\xintnewdummy</code> is public interface to a
<code>1.2e</code> macro which serves to declare any given catcode 11
character as a dummy variable for expressions
(<strong>xintexpr</strong>). This is useful for Unicode engines (the
Latin letters being already all pre-declared as dummy
variables.)</p></li>
<li><p>added <code>\xintiSqrtR</code>, there was only
<code>\xintiiSqrtR</code> alongside <code>\xintiSqrt</code> and
<code>\xintiiSqrt</code> (<strong>xint</strong>).</p></li>
<li><p>added non public <code>\xintLastItem:f:csv</code> to
<strong>xinttools</strong> for faster <code>last()</code> function, and
improved <code>\xintNewExpr</code> compatibility. Also
<code>\xintFirstItem:f:csv</code>.</p></li>
</ul>
<h3 id="bug-fixes-21">Bug fixes</h3>
<ul>
<li><p>the <code>1.2f</code> half-integer powers computed within
<code>\xintfloatexpr</code> had a silly rounding to the target precision
just <em>before</em> the final square-root extraction, thus possibly
losing some precision. The <code>1.2k</code> implementation keeps guard
digits for this final square root extraction. As for integer exponents,
it is guaranteed that the computed value differs from the exact one by
less than <code>0.52 ulp</code> (for inputs having at most
<code>\xinttheDigits</code> digits.)</p></li>
<li><p>more regressions from <code>1.2i</code> were fixed:
<code>\xintLen</code> (<strong>xint</strong>, <strong>xintfrac</strong>)
and <code>\xintDouble</code> (<strong>xintcore</strong>) had forgotten
that their argument was allowed to be negative. A regression test suite
is now in place and is being slowly expanded to cover more
macros.</p></li>
<li><p><code>\xintiiSquareRoot{0}</code> now produces
<code>{1}{1}</code>, which fits better the general documented behaviour
of this macro than <code>11</code>.</p></li>
</ul>
<h2 id="j-20161222"><code>1.2j (2016/12/22)</code></h2>
<h3 id="improvements-and-new-features-14">Improvements and new
features</h3>
<ul>
<li><p><strong>xinttools</strong> and <strong>xintexpr</strong>:</p>
<ol type="1">
<li><p>slightly improves the speed of <code>\xintTrim</code>.</p></li>
<li><p>speed gains for the handlers of comma separated lists
implementing Python-like slicing and item extraction. Relevant non
(user) documented macros better documented in
<code>sourcexint.pdf</code>.</p></li>
</ol></li>
<li><p>significant documentations tweaks (inclusive of suppressing
things!), and among them two beautiful hyperlinked tables with both
horizontal and vertical rules which bring the documentation of the
<strong>xintexpr</strong> syntax to a kind of awe-inspiring perfection…
except that implementation of some math functions is still
lacking.</p></li>
</ul>
<h3 id="bug-fixes-22">Bug fixes</h3>
<ul>
<li>fix two <code>1.2i</code> regressions caused by undefined macros
(<code>\xintNthElt</code> in certain branches and <code>[list][N]</code>
item extraction in certain cases.) The test files existed but were not
executed prior to release. Automation in progress.</li>
</ul>
<h2 id="i-20161213"><code>1.2i (2016/12/13)</code></h2>
<h3 id="breaking-changes-15">Breaking changes</h3>
<ul>
<li><code>\xintDecSplit</code> second argument must have no sign (former
code replaced it with its absolute value, a sign now may cause an
error.)</li>
</ul>
<h3 id="removed-2">Removed</h3>
<ul>
<li>deprecated macros <code>\xintifTrue</code>,
<code>\xintifTrueFalse</code>, <code>\xintQuo</code>,
<code>\xintRem</code>, <code>\xintquo</code>,
<code>\xintrem</code>.</li>
</ul>
<h3 id="improvements-and-new-features-15">Improvements and new
features</h3>
<ul>
<li><p><strong>xintkernel</strong>: <code>\xintLength</code> is faster.
New macros:</p>
<ul>
<li><p><code>\xintLastItem</code> to fetch the last item from its
argument,</p></li>
<li><p><code>\romannumeral\xintgobble</code> for gobbling many (up to
531440) upstream braced items or tokens.</p></li>
<li><p><code>\romannumeral\xintreplicate</code> which is copied over
from the expl3 <code>\prg_replicate:nn</code> with some minor
changes.</p></li>
</ul></li>
<li><p><strong>xinttools</strong>: general token list handling routines
<code>\xintKeep</code>, <code>\xintTrim</code> and
<code>\xintNthElt</code> are faster; but the novel
<code>\xintTrim</code> can only remove up to a maximum of 531440
items.</p>
<p>Also, <code>\xintFor</code> partially improves on some issues which
are reported upon in the documentation.</p></li>
<li><p>some old macros have been rewritten entirely or partially using
techniques which <strong>xint</strong> started using in release
<code>1.2</code>:</p>
<ul>
<li><p><strong>xintcore</strong>: <code>\xintDouble</code>,
<code>\xintHalf</code>, <code>\xintInc</code>, <code>\xintDec</code>,
<code>\xintiiLDg</code>, <code>\xintDSR</code> (originally from
<strong>xint</strong>), a novel <code>\xintDSRr</code>.</p></li>
<li><p><strong>xint</strong>: <code>\xintDSH</code>,
<code>\xintDSx</code>, <code>\xintDecSplit</code>,
<code>\xintiiE</code>.</p></li>
<li><p><strong>xintfrac</strong>: as a result of the above
<code>\xintTrunc</code>, <code>\xintRound</code> and
<code>\xintXTrunc</code> got faster. But the main improvement for them
is with decimal inputs which formerly had not been treated separately
from the general fraction case. Also, <code>\xintXTrunc</code> does not
anymore create a dependency of <strong>xintfrac</strong> on
<strong>xinttools</strong>.</p></li>
</ul></li>
<li><p>the documentation has again been (slightly) re-organized; it has
a new sub-section on the Miller-Rabin primality test, to illustrate some
use of <code>\xintNewFunction</code> for recursive definitions.</p></li>
<li><p>the documentation has dropped the LaTeX “command” terminology
(which had been used initially in 2013 for some forgotten reasons and
should have been removed long ago) and uses only the more apt “macro”,
as after all, all of <strong>xint</strong> is about expansion of macros
(plus the use of <code>\numexpr</code>).</p></li>
</ul>
<h3 id="bug-fixes-23">Bug fixes</h3>
<ul>
<li><code>\xintDecSplitL</code> and <code>\xintDecSplitR</code> from
<strong>xint</strong> produced their output in a spurious brace pair
(bug introduced in <code>1.2f</code>).</li>
</ul>
<h2 id="h-20161120"><code>1.2h (2016/11/20)</code></h2>
<h3 id="improvements-and-new-features-16">Improvements and new
features</h3>
<ul>
<li><p>new macro <code>\xintNewFunction</code> in
<strong>xintexpr</strong> which allows to extend the parser syntax with
functions in situations where <code>\xintdeffunc</code> is not usable
(typically, because dummy variables are used over a not yet determined
range of values because it depends on the variables).</p></li>
<li><p>after three years of strict obedience to <code>xint</code>
prefix, now <code>\thexintexpr</code>, <code>\thexintiexpr</code>,
<code>\thexintfloatexpr</code>, and <code>\thexintiiexpr</code> are
provided as synonyms to <code>\xinttheexpr</code>, etc…</p></li>
</ul>
<h3 id="bug-fixes-24">Bug fixes</h3>
<ul>
<li><p>the <code>(cond)?{foo}{bar}</code> operator from
<strong>xintexpr</strong> mis-behaved in certain circumstances (such as
an empty <code>foo</code>).</p></li>
<li><p>the <strong>xintexpr</strong> <code>1.2f</code>
<code>binomial</code> function (which uses <code>\xintiiBinomial</code>
from <strong>xint.sty</strong> or <code>\xintFloatBinomial</code> from
<strong>xintfrac.sty</strong>) deliberately raised an error for
<code>binomial(x,y)</code> with <code>y&lt;0</code> or
<code>x&lt;y</code>. This was unfortunate, and it now simply evaluates
to zero in such cases.</p></li>
<li><p>similarly the <code>pfactorial</code> function was very strict
and <code>pfactorial(x,y)</code> deliberately raised an out-of-range
error if not used with non-negative integers with <code>x</code> less
than <code>y</code>. It now avoids doing that and allows negative
arguments.</p></li>
<li><p>the <code>add</code> and <code>mul</code> from
<strong>xintexpr</strong>, which work with dummy variables since
<code>1.1</code>, raised an error since <code>1.2c 2015/11/16</code>
when the dummy variable was given an empty range (or list) of values,
rather than producing respectively <code>0</code> and <code>1</code> as
formerly.</p></li>
</ul>
<h2 id="g-20160319"><code>1.2g (2016/03/19)</code></h2>
<h3 id="breaking-changes-16">Breaking changes</h3>
<ul>
<li><p>inside expressions, list item selector <code>[L][n]</code> counts
starting at zero, not at one. This is more coherent with
<code>[L][a:b]</code> which was already exactly like in Python since its
introduction. A function len(L) replaces earlier
<code>[L][0]</code>.</p></li>
<li><p>former <code>iter</code> keyword now called <code>iterr</code>.
Indeed it matched with <code>rrseq</code>, the new <code>iter</code>
(which was somehow missing from <code>1.1</code>) is the one matching
<code>rseq</code>. Allows to iterate more easily with a “list”
variable.</p></li>
</ul>
<h3 id="improvements-and-new-features-17">Improvements and new
features</h3>
<ul>
<li><p>in <strong>xintexpr.sty</strong>: list selectors
<code>[L][n]</code> and <code>[L][a:b]</code> are more efficient: the
earlier <code>1.1</code> routines did back and forth conversions from
comma separated values to braced tokens, the <code>1.2g</code> routines
use macros from <strong>xinttools.sty</strong> handling directly the
encountered lists of comma separated values.</p></li>
<li><p>in <strong>xinttools.sty</strong>: slight improvements in the
efficiency of the <code>\xintNthElt</code>, <code>\xintKeep</code>,
<code>\xintTrim</code> routines and new routines handling directly comma
separated values. The latter are not included in the user manual (they
are not <code>\long</code>, they don’t make efforts to preserve some
braces, do not worry about spaces, all those worries being irrelevant to
the use in expressions for list selectors).</p></li>
<li><p>a slight speed improvement to <code>\xintFloatSqrt</code> in its
quest of correct rounding.</p></li>
<li><p>float multiplication and division handle more swiftly operands
(non-fractional) with few digits, when the float precision is
large.</p></li>
<li><p>the syntax of expressions is described in a devoted chapter of
the documentation; an example shows how to implement (expandably) the
Brent-Salamin algorithm for computation of Pi using <code>iter</code> in
a float expression.</p></li>
</ul>
<h2 id="f-20160312"><code>1.2f (2016/03/12)</code></h2>
<h3 id="breaking-changes-17">Breaking changes</h3>
<ul>
<li>no more <code>\xintFac</code> macro but
<code>\xintiFac/\xintiiFac/\xintFloatFac</code>.</li>
</ul>
<h3 id="improvements-and-new-features-18">Improvements and new
features</h3>
<ul>
<li><p>functions <code>binomial</code>, <code>pfactorial</code> and
<code>factorial</code> in both integer and float versions.</p></li>
<li><p>macros <code>\xintiiBinomial</code>,
<code>\xintiiPFactorial</code> (<strong>xint.sty</strong>) and
<code>\xintFloatBinomial</code>, <code>\xintFloatPFactorial</code>
(<strong>xintfrac.sty</strong>). Improvements to
<code>\xintFloatFac</code>.</p></li>
<li><p>faster implementation and increased accuracy of float power
macros. Half-integer exponents are now accepted inside float
expressions.</p></li>
<li><p>faster implementation of both integral and float square root
macros.</p></li>
<li><p>the float square root achieves <em>correct</em> (aka
<em>exact</em>) rounding in arbitrary precision.</p></li>
<li><p>modified behaviour for the <code>\xintPFloat</code> macro, used
by <code>\xintthefloatexpr</code> to prettify its output. It now opts
for decimal notation if and only if scientific notation would use an
exponent between <code>-5</code> and <code>5</code> inclusive. The zero
value is printed <code>0.</code> with a dot.</p></li>
<li><p>the float macros for addition, subtraction, multiplication,
division now first round their two operands to P, not P+2, significant
places before doing the actual computation (P being the target
precision). The same applies to the power macros and to the square root
macro.</p></li>
<li><p>the documentation offers a more precise (and accurate) discussion
of floating point issues.</p></li>
<li><p>various under-the-hood code improvements; the floatexpr
operations are chained in a faster way, from skipping some unneeded
parsing on results of earlier computations. The absence of a real inner
data structure for floats (incorporating their precisions, for one) is
however still a bit hair raising: currently the lengths of the mantissas
of the operands are computed again by each float macro or expression
operation.</p></li>
<li><p>(TeXperts only) the macros defined (internally) from
<code>\xintdeffunc</code> et al. constructs do not incorporate an
initial <code>\romannumeral</code> anymore.</p></li>
<li><p>renewed desperate efforts at improving the documentation by
random shuffling of sections and well thought additions; cuts were
considered and even performed.</p></li>
</ul>
<h3 id="bug-fixes-25">Bug fixes</h3>
<ul>
<li><p>squaring macro <code>\xintSqr</code> from
<strong>xintfrac.sty</strong> was broken due to a misspelled sub-macro
name. Dates back to <code>1.1</code> release of <code>2014/10/28</code>
<code>:-((</code>.</p></li>
<li><p><code>1.2c</code>’s fix to the subtraction bug from
<code>1.2</code> introduced another bug, which in some cases could
create leading zeroes in the output, or even worse. This could
invalidate other routines using subtractions, like
<code>\xintiiSquareRoot</code>.</p></li>
<li><p>the comparison operators were not recognized by
<code>\xintNewIIExpr</code> and <code>\xintdefiifunc</code>
constructs.</p></li>
</ul>
<h2 id="e-20151122"><code>1.2e (2015/11/22)</code></h2>
<h3 id="improvements-and-new-features-19">Improvements and new
features</h3>
<ul>
<li><p>macro <code>\xintunassignvar</code>.</p></li>
<li><p>slight modifications of the logged messages in case of
<code>\xintverbosetrue</code>.</p></li>
<li><p>a space in
<code>\xintdeffunc f(x)&lt;space&gt;:= expression ;</code> is now
accepted.</p></li>
<li><p>documentation enhancements: the <em>Quick Sort</em> section with
its included code samples has been entirely re-written; the <em>Commands
of the xintexpr package</em> section has been extended and reviewed
entirely.</p></li>
</ul>
<h3 id="bug-fixes-26">Bug fixes</h3>
<ul>
<li><p>in <strong>xintfrac</strong>: the <code>\xintFloatFac</code> from
release <code>1.2</code> parsed its argument only through
<code>\numexpr</code> but it should have used
<code>\xintNum</code>.</p></li>
<li><p>in <strong>xintexpr</strong>: release <code>1.2d</code> had
broken the recognition of sub-expressions immediately after variable
names (with tacit multiplication).</p></li>
<li><p>in <strong>xintexpr</strong>: contrarily to what
<code>1.2d</code> documentation said, tacit multiplication was not yet
always done with enhanced precedence. Now yes.</p></li>
</ul>
<h2 id="d-20151118"><code>1.2d (2015/11/18)</code></h2>
<h3 id="improvements-and-new-features-20">Improvements and new
features</h3>
<ul>
<li><p>the function definitions done by <code>\xintdeffunc</code> et
al., as well as the macro declarations by <code>\xintNewExpr</code> et
al. now have only local scope.</p></li>
<li><p>tacit multiplication applies to more cases, for example (x+y)z,
and always ties more than standard * infix operator, e.g. x/2y is like
x/(2*y).</p></li>
<li><p>some documentation enhancements, particularly in the chapter on
xintexpr.sty, and also in the code source comments.</p></li>
</ul>
<h3 id="bug-fixes-27">Bug fixes</h3>
<ul>
<li>in <strong>xintcore</strong>: release <code>1.2c</code> had
inadvertently broken the <code>\xintiiDivRound</code> macro.</li>
</ul>
<h2 id="c-20151116"><code>1.2c (2015/11/16)</code></h2>
<h3 id="improvements-and-new-features-21">Improvements and new
features</h3>
<ul>
<li><p>macros <code>\xintdeffunc</code>, <code>\xintdefiifunc</code>,
<code>\xintdeffloatfunc</code> and boolean
<code>\ifxintverbose</code>.</p></li>
<li><p>on-going code improvements and documentation enhancements, but
stopped in order to issue this bugfix release.</p></li>
</ul>
<h3 id="bug-fixes-28">Bug fixes</h3>
<ul>
<li>in <strong>xintcore</strong>: recent release <code>1.2</code>
introduced a bug in the subtraction (happened when 00000001 was found
under certain circumstances at certain mod 8 locations).</li>
</ul>
<h2 id="b-20151029"><code>1.2b (2015/10/29)</code></h2>
<h3 id="bug-fixes-29">Bug fixes</h3>
<ul>
<li>in <strong>xintcore</strong>: recent release <code>1.2</code>
introduced a bug in the division macros, causing a crash when the
divisor started with 99999999 (it was attempted to use with 1+99999999 a
subroutine expecting only 8-digits numbers).</li>
</ul>
<h2 id="a-20151019"><code>1.2a (2015/10/19)</code></h2>
<h3 id="improvements-and-new-features-22">Improvements and new
features</h3>
<ul>
<li><p>added <code>\xintKeepUnbraced</code>,
<code>\xintTrimUnbraced</code> (<strong>xinttools</strong>) and fixed
documentation of <code>\xintKeep</code> and <code>\xintTrim</code>
regarding brace stripping.</p></li>
<li><p>added <code>\xintiiMaxof/\xintiiMinof</code>
(<strong>xint</strong>).</p></li>
<li><p>TeX hackers only: replaced all code uses of
<code>\romannumeral-`0</code> by the quicker
<code>\romannumeral`&amp;&amp;@</code> (<code>^</code> being used as
letter, had to find another character usable with catcode 7).</p></li>
</ul>
<h3 id="bug-fixes-30">Bug fixes</h3>
<ul>
<li>in <strong>xintexpr</strong>: recent release <code>1.2</code>
introduced a bad bug in the parsing of decimal numbers and as a result
<code>\xinttheexpr 0.01\relax</code> expanded to <code>0</code> !
(sigh…)</li>
</ul>
<h2 id="section-2"><code>1.2 (2015/10/10)</code></h2>
<h3 id="removed-3">Removed</h3>
<ul>
<li>the macros <code>\xintAdd</code>, <code>\xintSub</code>,
<code>\xintMul</code>, <code>\xintMax</code>, <code>\xintMin</code>,
<code>\xintMaxof</code>, <code>\xintMinof</code> are removed from
package <strong>xint</strong>, and only exist in the versions from
<strong>xintfrac</strong>. With only <strong>xintcore</strong> or
<strong>xint</strong> loaded, one <em>must</em> use
<code>\xintiiAdd</code>, <code>\xintiiSub</code>, …, or
<code>\xintiAdd</code>, <code>\xintiSub</code>, etc…</li>
</ul>
<h3 id="improvements-and-new-features-23">Improvements and new
features</h3>
<ul>
<li><p>the basic arithmetic implemented in <strong>xintcore</strong> has
been entirely rewritten. The mathematics remains the elementary school
one, but the <code>TeX</code> implementation achieves higher speed
(except, regarding addition/subtraction, for numbers up to about thirty
digits), the gains becoming quite significant for numbers with hundreds
of digits.</p></li>
<li><p>the inputs must have less than 19959 digits. But computations
with thousands of digits take time.</p></li>
<li><p>a previously standing limitation of <code>\xintexpr</code>,
<code>\xintiiexpr</code>, and of <code>\xintfloatexpr</code> to numbers
of less than 5000 digits has been lifted.</p></li>
<li><p>a <em>qint</em> function is provided to help the parser gather
huge integers in one-go, as an exception to its normal mode of operation
which expands token by token.</p></li>
<li><p><code>\xintFloatFac</code> macro for computing the factorials of
integers as floating point numbers to a given precision. The
<code>!</code> postfix operator inside <code>\xintfloatexpr</code> maps
to this new macro rather than to the exact factorial as used by
<code>\xintexpr</code> and <code>\xintiiexpr</code>.</p></li>
<li><p>there is more flexibility in the parsing done by the macros from
<strong>xintfrac</strong> on fractional input: the decimal parts of both
the numerator and the denominator may arise from a separate expansion
via <code>\romannumeral-`0</code>. Also the strict <code>A/B[N]</code>
format is a bit relaxed: <code>N</code> may be anything understood by
<code>\numexpr</code> (it could even be empty but that possibility has
been removed by later <code>1.2f</code> release.)</p></li>
<li><p>on the other hand an isolated dot <code>.</code> is not legal
syntax anymore inside the expression parsers: there must be digits
either before or after. It remains legal input for the macros of
<strong>xintfrac</strong>.</p></li>
<li><p>added <code>\ht</code>, <code>\dp</code>, <code>\wd</code>,
<code>\fontcharht</code>, etc… to the tokens recognized by the parsers
and expanded by <code>\number</code>.</p></li>
<li><p>an obscure bug in package <strong>xintkernel</strong> has been
fixed, regarding the sanitization of catcodes: under certain
circumstances (which could not occur in a normal <code>LaTeX</code>
context), unusual catcodes could end up being propagated to the external
world.</p></li>
<li><p>an effort at randomly shuffling around various pieces of the
documentation has been done.</p></li>
</ul>
<h2 id="c-20150912"><code>1.1c (2015/09/12)</code></h2>
<ul>
<li><p>bugfix regarding macro <code>\xintAssign</code> from
<strong>xinttools</strong> which did not behave correctly in some
circumstances (if there was a space before <code>\to</code>, in
particular).</p></li>
<li><p>very minor code improvements, and correction of some issues
regarding the source code formatting in <code>sourcexint.pdf</code>, and
minor issues in <code>Makefile.mk</code>.</p></li>
</ul>
<h2 id="b-20150831"><code>1.1b (2015/08/31)</code></h2>
<ul>
<li><p>bugfix: some macros needed by the integer division routine from
<strong>xintcore</strong> had been left in <strong>xint.sty</strong>
since release <code>1.1</code>. This for example broke the
<code>\xintGCD</code> from <strong>xintgcd</strong> if package
<strong>xint</strong> was not loaded.</p></li>
<li><p>Slight enhancements to the documentation, particularly in the
<code>Read this first</code> section.</p></li>
</ul>
<h2 id="a-20141107"><code>1.1a (2014/11/07)</code></h2>
<ul>
<li><p>fixed a bug which prevented <code>\xintNewExpr</code> from
producing correctly working macros from a comma separated replacement
text.</p></li>
<li><p><code>\xintiiSqrtR</code> for rounded integer square root; former
<code>\xintiiSqrt</code> already produced truncated integer square root;
corresponding function <code>sqrtr</code> added to
<code>\xintiiexpr..\relax</code> syntax.</p></li>
<li><p>use of straight quotes in the documentation for better
legibility.</p></li>
<li><p>added <code>\xintiiIsOne</code>, <code>\xintiiifOne</code>,
<code>\xintiiifCmp</code>, <code>\xintiiifEq</code>,
<code>\xintiiifGt</code>, <code>\xintiiifLt</code>,
<code>\xintiiifOdd</code>, <code>\xintiiCmp</code>,
<code>\xintiiEq</code>, <code>\xintiiGt</code>, <code>\xintiiLt</code>,
<code>\xintiiLtorEq</code>, <code>\xintiiGtorEq</code>,
<code>\xintiiNeq</code>, mainly for efficiency of
<code>\xintiiexpr</code>.</p></li>
<li><p>for the same reason, added <code>\xintiiGCD</code> and
<code>\xintiiLCM</code>.</p></li>
<li><p>added the previously mentioned <code>ii</code> macros, and some
others from <code>1.1</code>, to the user manual. But their main usage
is internal to <code>\xintiiexpr</code>, to skip unnecessary
overheads.</p></li>
<li><p>various typographical fixes throughout the documentation, and a
bit of clean up of the code comments. Improved <code>\Factors</code>
example of nested <code>subs</code>, <code>rseq</code>,
<code>iter</code> in <code>\xintiiexpr</code>.</p></li>
</ul>
<h2 id="section-3"><code>1.1 (2014/10/28)</code></h2>
<h3 id="breaking-changes-18">Breaking changes</h3>
<ul>
<li><p>in <code>\xintiiexpr</code>, <code>/</code> does <em>rounded</em>
division, rather than the Euclidean division (for positive arguments,
this is truncated division). The <code>//</code> operator does truncated
division,</p></li>
<li><p>the <code>:</code> operator for three-way branching is gone,
replaced with <code>??</code>,</p></li>
<li><p><code>1e(3+5)</code> is now illegal. The number parser identifies
<code>e</code> and <code>E</code> in the same way it does for the
decimal mark, earlier versions treated <code>e</code> as <code>E</code>
rather as infix operators of highest precedence,</p></li>
<li><p>the <code>add</code> and <code>mul</code> have a new syntax, old
syntax is with <code>`+`</code> and <code>`*`</code> (left quotes
mandatory), <code>sum</code> and <code>prd</code> are gone,</p></li>
<li><p>no more special treatment for encountered brace pairs
<code>{..}</code> by the number scanner, <code>a/b[N]</code> notation
can be used without use of braces (the <code>N</code> will end up as is
in a <code>\numexpr</code>, it is not parsed by the
<code>\xintexpr</code>-ession scanner),</p></li>
<li><p>in earlier releases, place holders for <code>\xintNewExpr</code>
could either be denoted <code>#1</code>, <code>#2</code>, … or also
<code>$1</code>, <code>$2</code>, … Only the usual <code>#</code> form
is now accepted and the special cases previously treated via the second
form are now managed via a <code>protect(...)</code> function.</p></li>
<li><p><strong>xintfrac</strong>: <code>\xintFloor</code> and
<code>\xintCeil</code> add a trailing <code>/1[0]</code> to their
(integer) output. New <code>\xintiFloor</code> and
<code>\xintiCeil</code> do not.</p></li>
</ul>
<h3 id="removed-4">Removed</h3>
<ul>
<li><code>\xintnumexpr</code>, <code>\xintthenumexpr</code>,
<code>\xintNewNumExpr</code>: use <code>\xintiexpr</code>,
<code>\xinttheiexpr</code>, <code>\xintNewIExpr</code>.</li>
</ul>
<h3 id="deprecated-2">Deprecated</h3>
<ul>
<li><p><code>\xintDivision</code>, <code>\xintQuo</code>,
<code>\xintRem</code>: use <code>\xintiDivision</code>,
<code>\xintiQuo</code>, <code>\xintiRem</code>.</p></li>
<li><p><code>\xintMax</code>, <code>\xintMin</code>,
<code>\xintAdd</code>, <code>\xintSub</code>, <code>\xintMul</code>
(<strong>xint</strong>): their usage without <strong>xintfrac</strong>
is deprecated; use <code>\xintiMax</code>, <code>\xintiMin</code>,
<code>\xintiAdd</code>, <code>\xintiSub</code>,
<code>\xintiMul</code>.</p></li>
<li><p>the <code>&amp;</code> and <code>|</code> as Boolean operators in
<code>xintexpr</code>-essions are deprecated in favour of
<code>&amp;&amp;</code> and <code>||</code>. The single letter operators
might be assigned some other meaning in some later release (bitwise
operations, perhaps). Do not use them.</p></li>
</ul>
<h3 id="improvements-and-new-features-24">Improvements and new
features</h3>
<ul>
<li><p>new package <strong>xintcore</strong> has been split off
<strong>xint</strong>. It contains the core arithmetic macros (it is
loaded by LaTeX package <strong>bnumexpr</strong>),</p></li>
<li><p>neither <strong>xint</strong> nor <strong>xintfrac</strong> load
<strong>xinttools</strong>. Only <strong>xintexpr</strong>
does,</p></li>
<li><p>whenever some portion of code has been revised, often use has
been made of the <code>\xint_dothis</code> and <code>\xint_orthat</code>
pair of macros for expandably branching,</p></li>
<li><p>these tiny helpful macros, and a few others are in package
<strong>xintkernel</strong> which contains also the catcode and loading
order management code, initially inspired by code found in Heiko
Oberdiek’s packages,</p></li>
<li><p>the source code, which was suppressed from <code>xint.pdf</code>
in release <code>1.09n</code>, is now compiled into a separate file
<code>sourcexint.pdf</code>,</p></li>
<li><p>faster handling by <code>\xintAdd</code>, <code>\xintSub</code>,
<code>\xintMul</code>, … of the case where one of the arguments is
zero,</p></li>
<li><p>the <code>\xintAdd</code> and <code>\xintSub</code> macros from
package <strong>xintfrac</strong> check if one of the denominators is a
multiple of the other, and only if this is not the case do they multiply
the denominators. But systematic reduction would be too costly,</p></li>
<li><p>this naturally will be also the case for the <code>+</code> and
<code>-</code> operations in <code>\xintexpr</code>,</p></li>
<li><p><strong>xint</strong> added <code>\xintiiDivRound</code>,
<code>\xintiiDivTrunc</code>, <code>\xintiiMod</code> for rounded and
truncated division of big integers (next to <code>\xintiiQuo</code> and
<code>\xintiiRem</code>),</p></li>
<li><p>with <strong>xintfrac</strong> loaded, the <code>\xintNum</code>
macro does <code>\xintTTrunc</code> (which is truncation to an integer,
same as <code>\xintiTrunc {0}</code>),</p></li>
<li><p>added <code>\xintMod</code> to <strong>xintfrac</strong> for
modulo operation with fractional numbers,</p></li>
<li><p>added <code>\xintiFloor</code> and <code>\xintiCeil</code> to
<strong>xintfrac</strong>,</p></li>
<li><p><code>\xintiexpr</code>, <code>\xinttheiexpr</code> admit an
optional argument within brackets <code>[d]</code>, they round the
computation result (or results, if comma separated) to <code>d</code>
digits after decimal mark, (the whole computation is done exactly, as in
<code>xintexpr</code>),</p></li>
<li><p><code>\xintfloatexpr</code>, <code>\xintthefloatexpr</code>
similarly admit an optional argument which serves to keep only
<code>d</code> digits of precision, getting rid of cumulated
uncertainties in the last digits (the whole computation is done
according to the precision set via <code>\xintDigits</code>),</p></li>
<li><p><code>\xinttheexpr</code> and <code>\xintthefloatexpr</code>
<em>pretty-print</em> if possible, the former removing unit denominator
or <code>[0]</code> brackets, the latter avoiding scientific notation if
decimal notation is practical,</p></li>
<li><p>the <code>//</code> does truncated division and <code>/:</code>
is the associated modulo,</p></li>
<li><p>multi-character operators <code>&amp;&amp;</code>,
<code>||</code>, <code>==</code>, <code>&lt;=</code>,
<code>&gt;=</code>, <code>!=</code>, <code>**</code>,</p></li>
<li><p>multi-letter infix binary words <code>'and'</code>,
<code>'or'</code>, <code>'xor'</code>, <code>'mod'</code> (straight
quotes mandatory),</p></li>
<li><p>functions <code>even</code>, <code>odd</code>,</p></li>
<li><p><code>\xintdefvar A3:=3.1415;</code> for variable definitions
(non expandable, naturally), usable in subsequent expressions; variable
names may contain letters, digits, underscores. They should not start
with a digit, the <code>@</code> is reserved, and single lowercase and
uppercase Latin letters are predefined to work as dummy variables (see
next),</p></li>
<li><p>generation of comma separated lists <code>a..b</code>,
<code>a..[d]..b</code>,</p></li>
<li><p>Python syntax-like list extractors <code>[list][n:]</code>,
<code>[list][:n]</code>, <code>[list][a:b]</code> allowing negative
indices, but no optional step argument, and <code>[list][n]</code>
(<code>n=0</code> for the number of items in the list),</p></li>
<li><p>functions <code>first</code>, <code>last</code>,
<code>reversed</code>,</p></li>
<li><p>itemwise operations on comma separated lists
<code>a*[list]</code>, etc.., possible on both sides
<code>a*[list]^b</code>, and obeying the same precedence rules as with
numbers,</p></li>
<li><p><code>add</code> and <code>mul</code> must use a dummy variable:
<code>add(x(x+1)(x-1), x=-10..10)</code>,</p></li>
<li><p>variable substitutions with <code>subs</code>:
<code>subs(subs(add(x^2+y^2,x=1..y),y=t),t=20)</code>,</p></li>
<li><p>sequence generation using <code>seq</code> with a dummy variable:
<code>seq(x^3,     x=-10..10)</code>,</p></li>
<li><p>simple recursive lists with <code>rseq</code>, with
<code>@</code> given the last value,
<code>rseq(1;2@+1,i=1..10)</code>,</p></li>
<li><p>higher recursion with <code>rrseq</code>, <code>@1</code>,
<code>@2</code>, <code>@3</code>, <code>@4</code>, and
<code>@@(n)</code> for earlier values, up to <code>n=K</code> where
<code>K</code> is the number of terms of the initial stretch
<code>rrseq(0,1;@1+@2,i=2..100)</code>,</p></li>
<li><p>iteration with <code>iter</code> which is like <code>rrseq</code>
but outputs only the last <code>K</code> terms, where <code>K</code> was
the number of initial terms,</p></li>
<li><p>inside <code>seq</code>, <code>rseq</code>, <code>rrseq</code>,
<code>iter</code>, possibility to use <code>omit</code>,
<code>abort</code> and <code>break</code> to control
termination,</p></li>
<li><p><code>n++</code> potentially infinite index generation for
<code>seq</code>, <code>rseq</code>, <code>rrseq</code>, and
<code>iter</code>, it is advised to use <code>abort</code> or
<code>break(..)</code> at some point,</p></li>
<li><p>the <code>add</code>, <code>mul</code>, <code>seq</code>, … are
nestable,</p></li>
<li><p><code>\xintthecoords</code> converts a comma separated list of an
even number of items to the format expected by the <code>TikZ</code>
<code>coordinates</code> syntax,</p></li>
<li><p>completely new version <code>\xintNewExpr</code>,
<code>protect</code> function to handle external macros. The dollar sign
<code>$</code> for place holders is not accepted anymore, only the
standard macro parameter <code>#</code>. Not all constructs are
compatible with <code>\xintNewExpr</code>.</p></li>
</ul>
<h3 id="bug-fixes-31">Bug fixes</h3>
<ul>
<li><p><code>\xintZapFirstSpaces</code> hence also
<code>\xintZapSpaces</code> from package <strong>xinttools</strong> were
buggy when used with an argument either empty or containing only space
tokens.</p></li>
<li><p><code>\xintiiexpr</code> did not strip leading zeroes, hence
<code>\xinttheiiexpr 001+1\relax</code> did not obtain the expected
result …</p></li>
<li><p><code>\xinttheexpr \xintiexpr 1.23\relax\relax</code> should have
produced <code>1</code>, but it produced <code>1.23</code></p></li>
<li><p>the catcode of <code>;</code> was not set at package launching
time.</p></li>
<li><p>the <code>\XINTinFloatPrd:csv</code> macro name had a typo, hence
<code>prd</code> was non-functional in
<code>\xintfloatexpr</code>.</p></li>
</ul>
<h2 id="n-20140401"><code>1.09n (2014/04/01)</code></h2>
<ul>
<li><p>the user manual does not include by default the source code
anymore: the <code>\NoSourceCode</code> toggle in file
<code>xint.tex</code> has to be set to 0 before compilation to get
source code inclusion (later release <code>1.1</code> made source code
available as <code>sourcexint.pdf</code>).</p></li>
<li><p>bug fix (<strong>xinttools</strong>) in
<code>\XINT_nthelt_finish</code> (this bug was introduced in
<code>1.09i</code> of <code>2013/12/18</code> and showed up when the
index <code>N</code> was larger than the number of elements of the
list).</p></li>
</ul>
<h2 id="m-20140226"><code>1.09m (2014/02/26)</code></h2>
<ul>
<li><p>new in <strong>xinttools</strong>: <code>\xintKeep</code> keeps
the first <code>N</code> or last <code>N</code> elements of a list
(sequence of braced items); <code>\xintTrim</code> cuts out either the
first <code>N</code> or the last <code>N</code> elements from a
list.</p></li>
<li><p>new in <strong>xintcfrac</strong>: <code>\xintFGtoC</code> finds
the initial partial quotients common to two numbers or fractions
<code>f</code> and <code>g</code>; <code>\xintGGCFrac</code> is a clone
of <code>\xintGCFrac</code> which however does not assume that the
coefficients of the generalized continued fraction are numeric
quantities. Some other minor changes.</p></li>
</ul>
<h2 id="kb-20140213"><code>1.09kb (2014/02/13)</code></h2>
<ul>
<li><p>bug fix (<strong>xintexpr</strong>): an aloof modification done
by <code>1.09i</code> to <code>\xintNewExpr</code> had resulted in a
spurious trailing space present in the outputs of all macros created by
<code>\xintNewExpr</code>, making nesting of such macros
impossible.</p></li>
<li><p>bug fix (<strong>xinttools</strong>): <code>\xintBreakFor</code>
and <code>\xintBreakForAndDo</code> were buggy when used in the last
iteration of an <code>\xintFor</code> loop.</p></li>
<li><p>bug fix (<strong>xinttools</strong>): <code>\xintSeq</code> from
<code>1.09k</code> needed a <code>\chardef</code> which was missing from
<code>xinttools.sty</code>, it was in <code>xint.sty</code>.</p></li>
</ul>
<h2 id="k-20140121"><code>1.09k (2014/01/21)</code></h2>
<ul>
<li><p>inside <code>\xintexpr..\relax</code> (and its variants) tacit
multiplication is implied when a number or operand is followed directly
with an opening parenthesis,</p></li>
<li><p>the <code>"</code> for denoting (arbitrarily big) hexadecimal
numbers is recognized by <code>\xintexpr</code> and its variants
(package <strong>xintbinhex</strong> is required); a fractional
hexadecimal part introduced by a dot <code>.</code> is allowed.</p></li>
<li><p>re-organization of the first sections of the user
manual.</p></li>
<li><p>bug fix (<strong>xinttools</strong>, <strong>xint</strong>, …):
forgotten catcode check of <code>"</code> at loading time has been
added.</p></li>
</ul>
<h2 id="j-20140109"><code>1.09j (2014/01/09)</code></h2>
<ul>
<li><p>(<strong>xint</strong>) the core division routines have been
re-written for some (limited) efficiency gain, more pronounced for small
divisors. As a result the <em>computation of one thousand digits of
<span class="math inline"><em>π</em></span></em> is close to three times
faster than with earlier releases.</p></li>
<li><p>some various other small improvements, particularly in the power
routines.</p></li>
<li><p>(<strong>xintfrac</strong>) a macro <code>\xintXTrunc</code> is
designed to produce thousands or even tens of thousands of digits of the
decimal expansion of a fraction. Although completely expandable it has
its use limited to inside an <code>\edef</code>, <code>\write</code>,
<code>\message</code>, . It can thus not be nested as argument to
another package macro.</p></li>
<li><p>(<strong>xintexpr</strong>) the tacit multiplication done in
<code>\xintexpr..\relax</code> on encountering a count register or
variable, or a <code>\numexpr</code>, while scanning a (decimal) number,
is extended to the case of a sub <code>\xintexpr</code>-ession.</p></li>
<li><p><code>\xintexpr</code> can now be used in an <code>\edef</code>
with no <code>\xintthe</code> prefix; it will execute completely the
computation, and the error message about a missing <code>\xintthe</code>
will be inhibited. Previously, in the absence of <code>\xintthe</code>,
expansion could only be a full one (with <code>\romannumeral-`0</code>),
not a complete one (with <code>\edef</code>). Note that this differs
from the behavior of the non-expandable <code>\numexpr</code>:
<code>\the</code> or <code>\number</code> (or
<code>\romannumeral</code>) are needed not only to print but also to
trigger the computation, whereas <code>\xintthe</code> is mandatory only
for the printing step.</p></li>
<li><p>the default behavior of <code>\xintAssign</code> is changed, it
now does not do any further expansion beyond the initial full-expansion
which provided the list of items to be assigned to macros.</p></li>
<li><p>bug fix (<strong>xintfrac</strong>): <code>1.09i</code> did an
unexplainable change to <code>\XINT_infloat_zero</code> which broke the
floating point routines for vanishing operands =:(((</p></li>
<li><p>bug fix: the <code>1.09i</code> <code>xint.ins</code> file
produced a buggy <code>xint.tex</code> file.</p></li>
</ul>
<h2 id="i-20131218"><code>1.09i (2013/12/18)</code></h2>
<ul>
<li><p>(<strong>xintexpr</strong>) <code>\xintiiexpr</code> is a variant
of <code>\xintexpr</code> which is optimized to deal only with (long)
integers, <code>/</code> does a euclidean quotient.</p></li>
<li><p><em>deprecated</em>: <code>\xintnumexpr</code>,
<code>\xintthenumexpr</code>, <code>\xintNewNumExpr</code> are renamed,
respectively, <code>\xintiexpr</code>, <code>\xinttheiexpr</code>,
<code>\xintNewIExpr</code>. The earlier denominations are kept but are
to be removed at some point.</p></li>
<li><p>it is now possible within <code>\xintexpr...\relax</code> and its
variants to use count, dimen, and skip registers or variables without
explicit <code>\the/\number</code>: the parser inserts automatically
<code>\number</code> and a tacit multiplication is implied when a
register or variable immediately follows a number or fraction. Regarding
dimensions and <code>\number</code>, see the further discussion in
<em>Dimensions</em>.</p></li>
<li><p>(<strong>xintfrac</strong>) conditional <code>\xintifOne</code>;
<code>\xintifTrueFalse</code> renamed to <code>\xintifTrueAelseB</code>;
macros <code>\xintTFrac</code> (<code>fractional part</code>, mapped to
function <code>frac</code> in <code>\xintexpr</code>-essions),
<code>\xintFloatE</code>.</p></li>
<li><p>(<strong>xinttools</strong>) <code>\xintAssign</code> admits an
optional argument to specify the expansion type to be used:
<code>[]</code> (none, default), <code>[o]</code> (once),
<code>[oo]</code> (twice), <code>[f]</code> (full), <code>[e]</code>
(<code>\edef</code>),… to define the macros</p></li>
<li><p><strong>xinttools</strong> defines <code>\odef</code>,
<code>\oodef</code>, <code>\fdef</code> (if the names have already been
assigned, it uses <code>\xintoodef</code> etc…). These tools are
provided for the case one uses the package macros in a non-expandable
context. <code>\oodef</code> expands twice the macro replacement text,
and <code>\fdef</code> applies full expansion. They are useful in
situations where one does not want a full <code>\edef</code>.
<code>\fdef</code> appears to be faster than <code>\oodef</code> in
almost all cases (with less than thousand digits in the result), and
even faster than <code>\edef</code> for expanding the package macros
when the result has a few dozens of digits. <code>\oodef</code> needs
that expansion ends up in thousands of digits to become competitive with
the other two.</p></li>
<li><p>some across the board slight efficiency improvement as a result
of modifications of various types to <em>fork macros</em> and
<em>branching conditionals</em> which are used internally.</p></li>
<li><p>bug fix (<strong>xint</strong>): <code>\xintAND</code> and
<code>\xintOR</code> inserted a space token in some cases and did not
expand as promised in two steps <code>:-((</code> (bug dating back to
<code>1.09a</code> I think; this bug was without consequences when using
<code>&amp;</code> and <code>|</code> in <code>\xintexpr-essions</code>,
it affected only the macro form).</p></li>
<li><p>bug fix (<strong>xintcfrac</strong>): <code>\xintFtoCCv</code>
still ended fractions with the <code>[0]</code>’s which were supposed to
have been removed since release <code>1.09b</code>.</p></li>
<li><p><em>deprecated</em>: <code>\xintifTrueFalse</code>,
<code>\xintifTrue</code>; use <code>\xintifTrueAelseB</code>.</p></li>
</ul>
<h2 id="h-20131128"><code>1.09h (2013/11/28)</code></h2>
<ul>
<li><p>parts of the documentation have been re-written or re-organized,
particularly the discussion of expansion issues and of input and output
formats.</p></li>
<li><p>the expansion types of macro arguments are documented in the
margin of the macro descriptions, with conventions mainly taken over
from those in the <code>LaTeX3</code> documentation.</p></li>
<li><p>a dependency of <strong>xinttools</strong> on
<strong>xint</strong> (inside <code>\xintSeq</code>) has been
removed.</p></li>
<li><p>(<strong>xintgcd</strong>)
<code>\xintTypesetEuclideAlgorithm</code> and
<code>\xintTypesetBezoutAlgorithm</code> have been slightly modified
(regarding indentation).</p></li>
<li><p>(<strong>xint</strong>) macros <code>xintiSum</code> and
<code>xintiPrd</code> are renamed to <code>\xintiiSum</code> and
<code>\xintiiPrd</code>.</p></li>
<li><p>(<strong>xinttools</strong>) a count register used in
<code>1.09g</code> in the <code>\xintFor</code> loops for parsing
purposes has been removed and replaced by use of a
<code>\numexpr</code>.</p></li>
<li><p>the few uses of <code>\loop</code> have been replaced by
<code>\xintloop/\xintiloop</code>.</p></li>
<li><p>all macros of <strong>xinttools</strong> for which it makes sense
are now declared <code>\long</code>.</p></li>
</ul>
<h2 id="g-20131122"><code>1.09g (2013/11/22)</code></h2>
<ul>
<li><p>a package <strong>xinttools</strong> is detached from
<strong>xint</strong>, to make tools such as <code>\xintFor</code>,
<code>\xintApplyUnbraced</code>, and <code>\xintiloop</code> available
without the <strong>xint</strong> overhead.</p></li>
<li><p>expandable nestable loops <code>\xintloop</code> and
<code>\xintiloop</code>.</p></li>
<li><p>bugfix: <code>\xintFor</code> and <code>\xintFor*</code> do not
modify anymore the value of <code>\count 255</code>.</p></li>
</ul>
<h2 id="f-20131104"><code>1.09f (2013/11/04)</code></h2>
<ul>
<li><p>(<strong>xint</strong>) <code>\xintZapFirstSpaces</code>,
<code>\xintZapLastSpaces</code>, <code>\xintZapSpaces</code>,
<code>\xintZapSpacesB</code>, for expandably stripping away leading
and/or ending spaces.</p></li>
<li><p><code>\xintCSVtoList</code> by default uses
<code>\xintZapSpacesB</code> to strip away spaces around commas (or at
the start and end of the comma separated list).</p></li>
<li><p>also the <code>\xintFor</code> loop will strip out all spaces
around commas and at the start and the end of its list argument; and
similarly for <code>\xintForpair</code>, <code>\xintForthree</code>,
<code>\xintForfour</code>.</p></li>
<li><p><code>\xintFor</code> <em>et al.</em> accept all macro parameters
from <code>#1</code> to <code>#9</code>.</p></li>
<li><p>for reasons of inner coherence some macros previously with one
extra <code>i</code> in their names (e.g. <code>\xintiMON</code>) now
have a doubled <code>ii</code> (<code>\xintiiMON</code>) to indicate
that they skip the overhead of parsing their inputs via
<code>\xintNum</code>. Macros with a <em>single</em> <code>i</code> such
as <code>\xintiAdd</code> are those which maintain the
non-<strong>xintfrac</strong> output format for big integers, but do
parse their inputs via <code>\xintNum</code> (since release
<code>1.09a</code>). They too may have doubled-<code>i</code> variants
for matters of programming optimization when working only with (big)
integers and not fractions or decimal numbers.</p></li>
</ul>
<h2 id="e-20131029"><code>1.09e (2013/10/29)</code></h2>
<ul>
<li><p>(<strong>xint</strong>) <code>\xintintegers</code>,
<code>\xintdimensions</code>, <code>\xintrationals</code> for infinite
<code>\xintFor</code> loops, interrupted with <code>\xintBreakFor</code>
and <code>\xintBreakForAndDo</code>.</p></li>
<li><p><code>\xintifForFirst</code>, <code>\xintifForLast</code> for the
<code>\xintFor</code> and <code>\xintFor*</code> loops,</p></li>
<li><p>the <code>\xintFor</code> and <code>xintFor*</code> loops are now
<code>\long</code>, the replacement text and the items may contain
explicit <code>\par</code>’s.</p></li>
<li><p>conditionals <code>\xintifCmp</code>, <code>\xintifInt</code>,
<code>\xintifOdd</code>.</p></li>
<li><p>bug fix (<strong>xint</strong>): the <code>\xintFor</code> loop
(not <code>\xintFor*</code>) did not correctly detect an empty
list.</p></li>
<li><p>bug fix (<strong>xint</strong>): <code>\xintiSqrt {0}</code>
crashed. <code>:-((</code></p></li>
<li><p>the documentation has been enriched with various additional
examples, such as the <em>the quick sort algorithm illustrated</em> or
the various ways of <em>computing prime numbers</em>.</p></li>
<li><p>the documentation explains with more details various expansion
related issues, particularly in relation to conditionals.</p></li>
</ul>
<h2 id="d-20131022"><code>1.09d (2013/10/22)</code></h2>
<ul>
<li><p>bug fix (<strong>xint</strong>): <code>\xintFor*</code> is
modified to gracefully handle a space token (or more than one) located
at the very end of its list argument (as the space before
<code>\do</code> in
<code>\xintFor* #1 in     {{a}{b}{c}&lt;space&gt;} \do {stuff}</code>;
spaces at other locations were already harmless). Furthermore this new
version <em>f-expands</em> the un-braced list items. After
<code>\def\x{{1}{2}}</code> and
<code>\def\y{{a}\x     {b}{c}\x }</code>, <code>\y</code> will appear to
<code>\xintFor*</code> exactly as if it had been defined as
<code>\def\y{{a}{1}{2}{b}{c}{1}{2}}</code>.</p></li>
<li><p>same bug fix for <code>\xintApplyInline</code>.</p></li>
</ul>
<h2 id="c-20131009"><code>1.09c (2013/10/09)</code></h2>
<ul>
<li><p>(<strong>xintexpr</strong>) added <code>bool</code> and
<code>togl</code> to the <code>\xintexpr</code> syntax; also added
<code>\xintboolexpr</code> and <code>\xintifboolexpr</code>.</p></li>
<li><p>added <code>\xintNewNumExpr</code>.</p></li>
<li><p>the factorial <code>!</code> and branching <code>?</code>,
<code>:</code>, operators (in <code>\xintexpr...\relax</code>) have now
less precedence than a function name located just before,</p></li>
<li><p>(<strong>xint</strong>) <code>\xintFor</code> is a new type of
loop, whose replacement text inserts the comma separated values or list
items via macro parameters, rather than encapsulated in macros; the
loops are nestable up to four levels (nine levels since
<code>1.09f</code>) and their replacement texts are allowed to close
groups as happens with the tabulation in alignments,</p></li>
<li><p><code>\xintForpair</code>, <code>\xintForthree</code>,
<code>\xintForfour</code> are experimental variants of
<code>\xintFor</code>,</p></li>
<li><p><code>\xintApplyInline</code> has been enhanced in order to be
usable for generating rows (partially or completely) in an
alignment,</p></li>
<li><p>command <code>\xintSeq</code> to generate (expandably) arithmetic
sequences of (short) integers,</p></li>
<li><p>again various improvements and changes in the
documentation.</p></li>
</ul>
<h2 id="b-20131003"><code>1.09b (2013/10/03)</code></h2>
<ul>
<li><p>various improvements in the documentation,</p></li>
<li><p>more economical catcode management and re-loading
handling,</p></li>
<li><p>removal of all those <code>[0]</code>’s previously forcefully
added at the end of fractions by various macros of
<strong>xintcfrac</strong>,</p></li>
<li><p><code>\xintNthElt</code> with a negative index returns from the
tail of the list,</p></li>
<li><p>macro <code>\xintPRaw</code> to have something like what
<code>\xintFrac</code> does in math mode; i.e. a <code>\xintRaw</code>
which does not print the denominator if it is one.</p></li>
</ul>
<h2 id="a-20130924"><code>1.09a (2013/09/24)</code></h2>
<ul>
<li><p>(<strong>xintexpr</strong>) <code>\xintexpr..\relax</code> and
<code>\xintfloatexpr..\relax</code> admit functions in their syntax,
with comma separated values as arguments, among them
<code>reduce, sqr, sqrt, abs, sgn, floor, ceil,     quo, rem, round, trunc, float, gcd, lcm, max, min, sum, prd, add,     mul, not, all, any, xor</code>.</p></li>
<li><p>comparison (<code>&lt;</code>, <code>&gt;</code>, <code>=</code>)
and logical (<code>|</code>, <code>&amp;</code>) operators.</p></li>
<li><p>the command <code>\xintthe</code> which converts
<code>\xintexpr</code>essions into printable format (like
<code>\the</code> with <code>\numexpr</code>) is more efficient, for
example one can do <code>\xintthe\x</code> if <code>\x</code> was
defined to be an <code>\xintexpr..\relax</code>:</p>
<pre><code>\def\x{\xintexpr 3^57\relax}
\def\y{\xintexpr \x^(-2)\relax}
\def\z{\xintexpr \y-3^-114\relax}
\xintthe\z</code></pre></li>
<li><p><code>\xintnumexpr .. \relax</code> (now renamed
<code>\xintiexpr</code>) is
<code>\xintexpr     round( .. ) \relax</code>.</p></li>
<li><p><code>\xintNewExpr</code> now works with the standard macro
parameter character <code>#</code>.</p></li>
<li><p>both regular <code>\xintexpr</code>-essions and commands defined
by <code>\xintNewExpr</code> will work with comma separated lists of
expressions,</p></li>
<li><p>commands <code>\xintFloor</code>, <code>\xintCeil</code>,
<code>\xintMaxof</code>, <code>\xintMinof</code> (package
<strong>xintfrac</strong>), <code>\xintGCDof</code>,
<code>\xintLCM</code>, <code>\xintLCMof</code> (package
<strong>xintgcd</strong>), <code>\xintifLt</code>,
<code>\xintifGt</code>, <code>\xintifSgn</code>,
<code>\xintANDof</code>, …</p></li>
<li><p>The arithmetic macros from package <strong>xint</strong> now
filter their operands via <code>\xintNum</code> which means that they
may use directly count registers and <code>\numexpr</code>-essions
without having to prefix them by <code>\the</code>. This is thus similar
to the situation holding previously already when
<strong>xintfrac</strong> was loaded.</p></li>
<li><p>a bug (<strong>xintfrac</strong>) introduced in
<code>1.08b</code> made <code>\xintCmp</code> crash when one of its
arguments was zero. <code>:-((</code></p></li>
</ul>
<h2 id="b-20130614"><code>1.08b (2013/06/14)</code></h2>
<ul>
<li><p>(<strong>xintexpr</strong>) Correction of a problem with spaces
inside <code>\xintexpr</code>-essions.</p></li>
<li><p>(<strong>xintfrac</strong>) Additional improvements to the
handling of floating point numbers.</p></li>
<li><p>section <em>Use of count registers</em> documenting how count
registers may be directly used in arguments to the macros of
<strong>xintfrac</strong>.</p></li>
</ul>
<h2 id="a-20130611"><code>1.08a (2013/06/11)</code></h2>
<ul>
<li><p>(<strong>xintfrac</strong>) Improved efficiency of the basic
conversion from exact fractions to floating point numbers, with ensuing
speed gains especially for the power function macros
<code>\xintFloatPow</code> and <code>\xintFloatPower</code>,</p></li>
<li><p>Better management by <code>\xintCmp</code>,
<code>\xintMax</code>, <code>\xintMin</code> and <code>\xintGeq</code>
of inputs having big powers of ten in them.</p></li>
<li><p>Macros for floating point numbers added to the
<strong>xintseries</strong> package.</p></li>
</ul>
<h2 id="section-4"><code>1.08 (2013/06/07)</code></h2>
<ul>
<li><p>(<strong>xint</strong> and <strong>xintfrac</strong>) Macros for
extraction of square roots, for floating point numbers
(<code>\xintFloatSqrt</code>), and integers
(<code>\xintiSqrt</code>).</p></li>
<li><p>new package <strong>xintbinhex</strong> providing <em>conversion
routines</em> to and from binary and hexadecimal bases.</p></li>
</ul>
<h2 id="section-5"><code>1.07 (2013/05/25)</code></h2>
<ul>
<li><p>The <strong>xintexpr</strong> package is a new core constituent
(which loads automatically <strong>xintfrac</strong> and
<strong>xint</strong>) and implements the expandable expanding
parser</p>
<pre><code>\xintexpr . . . \relax,</code></pre>
<p>and its variant</p>
<pre><code>\xintfloatexpr . . . \relax</code></pre>
<p>allowing on input formulas using the infix operators <code>+</code>,
<code>-</code>, <code>*</code>, <code>/</code>, and <code>^</code>, and
arbitrary levels of parenthesizing. Within a float expression the
operations are executed according to the current value set by
<code>\xintDigits</code>. Within an <code>\xintexpr</code>-ession the
binary operators are computed exactly.</p>
<p>To write the <code>\xintexpr</code> parser I benefited from the
commented source of the <code>l3fp</code> parser; the
<code>\xintexpr</code> parser has its own features and peculiarities.
<em>See its documentation</em>.</p></li>
<li><p>The floating point precision <code>D</code> is set (this is a
local assignment to a <code>\mathchar</code> variable) with
<code>\xintDigits := D;</code> and queried with
<code>\xinttheDigits</code>. It may be set to anything up to
<code>32767</code>.<a href="#fn1" class="footnote-ref" id="fnref1"
role="doc-noteref"><sup>1</sup></a> The macro incarnations of the binary
operations admit an optional argument which will replace pointwise
<code>D</code>; this argument may exceed the <code>32767</code>
bound.</p></li>
<li><p>The <strong>xintfrac</strong> macros now accept numbers written
in scientific notation, the <code>\xintFloat</code> command serves to
output its argument with a given number <code>D</code> of significant
figures. The value of <code>D</code> is either given as optional
argument to <code>\xintFloat</code> or set with
<code>\xintDigits := D;</code>. The default value is
<code>16</code>.</p></li>
</ul>
<h2 id="b-20130514"><code>1.06b (2013/05/14)</code></h2>
<ul>
<li>Minor code and documentation improvements. Everywhere in the source
code, a more modern underscore has replaced the @ sign.</li>
</ul>
<h2 id="section-6"><code>1.06 (2013/05/07)</code></h2>
<ul>
<li><p>Some code improvements, particularly for macros of
<strong>xint</strong> doing loops.</p></li>
<li><p>New utilities in <strong>xint</strong> for expandable
manipulations of lists:</p>
<pre><code>\xintNthElt, \xintCSVtoList, \xintRevWithBraces</code></pre></li>
<li><p>The macros did only a double expansion of their arguments. They
now fully expand them (using <code>\romannumeral-`0</code>).
Furthermore, in the case of arguments constrained to obey the TeX bounds
they will be inserted inside a <code>\numexpr..\relax</code>, hence
completely expanded, one may use count registers, even infix arithmetic
operations, etc…</p></li>
</ul>
<h2 id="section-7"><code>1.05 (2013/05/01)</code></h2>
<p>Minor changes and additions to <strong>xintfrac</strong> and
<strong>xintcfrac</strong>.</p>
<h2 id="section-8"><code>1.04 (2013/04/25)</code></h2>
<ul>
<li><p>New component <strong>xintcfrac</strong> devoted to continued
fractions.</p></li>
<li><p><strong>xint</strong>: faster division.</p></li>
<li><p><strong>xint</strong>: added expandable macros
<code>\xintListWithSep</code> and <code>\xintApply</code> to handle
token lists.</p></li>
<li><p><strong>xintfrac</strong>: added
<code>\xintRound</code>.</p></li>
<li><p><strong>xintseries</strong> has a new implementation of
<code>\xintPowerSeries</code> based on a Horner scheme, and new macro
<code>\xintRationalSeries</code>. Both to help deal with the
<em>denominator buildup</em> plague.</p></li>
<li><p><code>tex xint.dtx</code> extracts style files (no need for a
<code>xint.ins</code>).</p></li>
<li><p>Bug fix (<strong>xintfrac</strong>): <code>\xintIrr {0}</code>
crashed.</p></li>
</ul>
<h2 id="section-9"><code>1.03 (2013/04/14)</code></h2>
<ul>
<li><p>New modules <strong>xintfrac</strong> (expandable operations on
fractions) and <strong>xintseries</strong> (expandable partial sums with
xint package).</p></li>
<li><p>Slightly improved division and faster multiplication (the best
ordering of the arguments is chosen automatically).</p></li>
<li><p>Added illustration of Machin algorithm to the
documentation.</p></li>
</ul>
<h2 id="section-10"><code>1.0 (2013/03/28)</code></h2>
<p>Initial announcement:</p>
<blockquote>
<p>The <strong>xint</strong> package implements with expandable TeX
macros the basic arithmetic operations of addition, subtraction,
multiplication and division, as applied to arbitrarily long numbers
represented as chains of digits with an optional minus sign.</p>
</blockquote>
<blockquote>
<p>The <strong>xintgcd</strong> package provides implementations of the
Euclidean algorithm and of its typesetting.</p>
</blockquote>
<blockquote>
<p>The packages may be used with Plain and with LaTeX.</p>
</blockquote>
<section class="footnotes footnotes-end-of-document"
role="doc-endnotes">
<hr />
<ol>
<li id="fn1" role="doc-endnote"><p>but values higher than 100 or 200
will presumably give too slow evaluations.<a href="#fnref1"
class="footnote-back" role="doc-backlink">↩︎</a></p></li>
</ol>
</section>
</body>
</html>